设计模式的使用场景GoF23(含gitee仓库代码示例)

代码仓库地址: https://gitee.com/buxingzhe/designpattern.git

设计模式是十分抽象的,想要熟练掌握并能够在实际编码中应用很困难。我们平时使用的各种框架spring,mybatis等源码,之所以看不懂,就是因为这些框架使用了大量的设计模式。一个框架想要有广泛的适用性,就必须要灵活,可扩展性、兼容性强,考虑各类情况,所以广泛使用了如工厂模式,建造者模式,适配器模式,装饰者模式,桥接模式,责任链模式,策略模式,命令模式等等。而如果读者不懂设计模式,看源码自然也就看不懂,我们学习源码就是要学习框架的设计思想,使用了那些设计模式,没有必要去搞懂每一行代码是什么意思,搞懂了也意义不大。

其实在实际业务编码中使用设计模式并不多,有时候我们其实已经使用了设计模式或者多种模式的组合,只是自己不知道。业务代码不像框架,可复用性不高,功能都是独有的,下订单就是下订单,发货就是发货。我常用到的设计模式也就那几种如工厂模式、单例模式、适配器模式、建造者模式、装饰者模式、桥接模式,责任链模式、策略模式,使用的也不是很熟练。

设计模式说白了就是写代码的套路,使用设计模式就必然会增加代码的复杂度和抽象程度,增加了很多中间类,因为要解耦,满足一些设计原则,当然看起来也就费劲。很多框架源码是不写注释的,debug时跳来跳去,比如spring随便一个方法都几十层调用(要是有),让人十分崩溃,如果你懂设计模式,从顶层类如接口或抽象类往下看也就能看懂了。实际编码中我认为遵循面向对象设计的七大原则更重要,设计模式就是为了遵循这些设计原则研究出来的特定场景下的解决方案。面向对象的设计原则有开闭原则(面向对象设计的主要目标)、单一职责原则依赖倒转原则里氏代换原则(很重要的原则,java中多态的完美体现)、接口隔离原则组合复用原则迪米特法则(业内俗称不要和陌生人说话,就是类和类之间尽量保持最少知识,耦合性保持最低,除非必要),这七个设计原则的详细说明这里不再赘述,请自行搜索相关资料加深理解。

业务代码中千万不要强行套用设计模式,除非真的有必要使用,不然只会让我们的代码变得复杂,读起来费劲被同事吐槽ZB,不是使用了设计模式,代码就像艺术品了。所以搞清楚各个设计模式的使用场景是非常重要的,遇到一个业务场景,先思考有无必要使用设计模式,哪种设计模式合适再详细思考设计,具体设计模式怎么用,设计时搜索资料查询用例都不迟,毕竟设计模式是抽象的,需要经过大量代码实践才能掌握,一开始不熟悉使用很正常。
 

这里放一张网图,可以看下比较重要且常用的设计模式,有侧重点的学习

下面详细说下23种常用设计模式(现在的设计模式种类已经远远不止23种了,可能有将近50种)的使用场景。

一、工厂模式

1.1 工厂方法模式结构
1.1.1 Product(抽象产品)

它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。

1.1.2 ConcreteProduct(具体产品)

它实现或者继承了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间是一对一的关系。

1.1.3 Factory(抽象工厂)

在抽象工厂类中声明了工厂方法,用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的具体工厂类都必须实现该接口。

1.1.4 ConcreteFactory(具体工厂)

它是抽象工厂类的子类,实现了抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。

1.2 使用场景

在工厂模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建。

在工厂模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时子类覆盖父类对象,从而使得系统更容易扩展。

二、建造者模式

2.1 建造者模式结构
2.1.1 Builder(抽象建造者)

为创建一个产品对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法用于创建复杂对象的各个部件,另一类是用于返回复杂对象。Builder可以是抽象类,也可以是接口。

2.1.2 ConcreteBuilder(具体建造者)

实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品对象(此方法也可以写在抽象建造者中,成为公共方法供调用)

2.1.3 Product(产品)

它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

2.1.4 Director(指挥者)

指挥者又称为导演类,负责安排复杂对象的构建次序,指挥者与抽象建造者存在关联关系,可以在其constructor()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要和指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者,然后通过指挥者类的构造函数或者setter方法将该对象传入指挥者类中。
 

2.2 建造者模式适用环境

需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量。

需要生成的产品对象的属性互相依赖,需要指定其生成顺序。

对象的创建过程独立于创建该对象的类。在建造者模式中通过引入指挥者类将创建过程封装在指挥者类中,而不在建造者类和客户类中。

隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

未完待续。。。

猜你喜欢

转载自blog.csdn.net/weixin_40141628/article/details/132482182