设计模式提供了一套可复用的设计范式。
设计模式的类型
设计模式主要可划分为三种类型:创建型模式主要是针对对象是如何实例化的过程进行设计;结构型模式针对类和对象的组合关系进行设计;行为型模式关注的是类和对象的通信,或者说交互问题。
创建型模式有:工厂方法模式、抽象工厂模式、建造者模式、单例模式和原型模式
结构型模式有:适配器模式、装饰器模式、代理模式、门面模式、组合模式、享元模式和桥接模式。
行为型模式有:策略模式、观察者模式、责任链模式、解释器模式、模板方法模式、迭代器模式、中介者模式、命令模式、访问者模式、备忘录模式和状态模式。
创建型模式
工厂模式相关
首先先说简单工厂模式,在不考虑设计模式的情况下,一般类继承接口,类再实例化获得对象,但当规模扩展时,直接调用类的实例化会使对象和类的关系比较耦合(距离产生美),之后可能的修改也会比较困难。简单地说,创建一个工厂类,有工厂类中的创建方法来实现类的实例化,为了方便调用可以直接将这个方法写成工厂类的静态方法,方便调用。如果使用类似switch判断的问题导致项目扩展过程中反复修改工厂类的话,可以考虑使用语言特性来解决,像是Java中的反射。
再说工厂方法模式,还是上面的问题,不过现在获得对象的步骤变复杂了,例如想要获得预期的对象需要大量的重复代码,在大方向上区别不大但在细节上需要有所区别等。这样的话,在简单工厂的逻辑上进一步提升,所谓专人干专事,同一类对象就交给同一个专用的工厂去生成,具体的类衍生自抽象的类,满足了上面提到的要求。相比简单工厂,可以说是更加细化了工厂的类别。
最后说抽象工厂模式,问题进一步复杂化,产品有了两个乃至多个维度。举个例子,某个具体品牌的电饭煲,在品牌维度上属于某具体品牌,在电器类型维度上属于电饭煲,那么构建这个具体品牌的电饭煲就需要在这个具体品牌的工厂生产电饭煲(当然,在电饭煲工厂生产属于某个具体品牌的电饭煲就不合逻辑了,需要考虑实际情况)。所以首先获取该具体品牌工厂的实例,即具体工厂的类实例化,再调用该工厂生产具体产品的方法(即在工厂中完成产品的实例化)。
看到最后,感觉三个工厂模式的复杂度层层递进,处理的维度层数越来越复杂,多数情况人们不关心实例是怎么创建的,工厂模式把实例化的过程封装在了工厂中,提供了获取实例的一个开口罢了。
建造者模式
使用静态内部类来实现建造者模式,即一个产品类中带有一个建造者的静态类负责产品的组装创建。类似煎饼和煎饼师傅的关系?
https://blog.csdn.net/weixin_46121939/article/details/119088667
实例:sql语句的组装就可以用建造者模式来解决。Laravel框架在查询构造器中就是这样处理的。Laravel container
门面模式(Facade)
设想一个场景,一个功能的实现是基于之前已经完成的各个子功能的拼接,如果不做拼接的步骤,每次都需要考虑子功能间的关系,如果把各个子功能的接口调用过程封装到一个类中,只提供一个调用接口,这样的类就是一个门面。
其实简单来说就是步骤复杂时做的过程封装,复用时直接调用开放的接口就行了。
当然步骤的复杂有繁有简。
实例:在Laravel框架中有一批被称为门面的类,为应用程序的服务容器中可用的类提供了静态接口。相比传统的静态方法调用,Facade提供的语法更简洁,测试性和扩展性更好。