设计模式学习总结--创建型模式

简单工厂(23种设计模式外的一种)

定义:由一个工厂对象决定创建出哪一种产品类的实例

适用场景:工厂类负责创建的对象比较少;客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

优点:只需要传入一个正确的参数,就可以获取你所需要的对象而无需知道其创建细节

缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

 

 

产品等级、产品族

产品等级:产品等级结构即产品的继承结构。如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

 

 

工厂方法(为了解决同一产品等级的业务抽象问题)

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行

适用场景:创建对象需要大量重复的代码;客户端(应用层)不依赖于产品类实例如何被创建、实例化等细节;一个类通过其子类来制定创建哪个对象

优点:用户只需要关心所需产品对应的工厂,无需关心创建细节;加入新产品符合开闭原则,提高可扩展性

缺点:类的个数容易过多,增加复杂度;增加了系统的抽象性和理解难度

 

 

抽象工厂(为了解决同一产品族的业务抽象问题)

定义:提供一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类

适用场景:客户端(应用层)不依赖于产品类实例如何被创建、实例化等细节;强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码;提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

优点:具体产品在应用层代码隔离,无需关心创建细节;将一个系列的产品族统一到一起创建

缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口;增加了系统的抽象性和理解难度

 

 

建造者模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道

适用场景:如果一个对象有非常复杂的内部结构(很多属性);想把复杂对象的创建和使用分离

优点:封装性好,创建和使用分离;扩展性好、建造类之间独立、一定程度上解耦

缺点:产生多余的Builder对象;产品内部发生变化,建造者都需要修改,成本较大

 

建造者模式与工厂模式:

建造者模式:更注重与方法的调用顺序,不仅需要创建出产品还需要知道产品是由哪些部件(属性)组成的;建造者模式可以创建一些复杂的产品、由各种复杂的属性组成

工厂模式:更注重于创建产品,只要把这个产品创建出来就OK;工厂模式创建出来的都是一个样的

 

 

单列模式

定义:保证一个类仅有一个实例,并提供一个全局访问点

适用场景:想确保任何情况下都绝对只有一个实例

优点:在内存里只有一个实例,减少了内存开销;可以避免对资源的多重占用;设置全局访问点,严格控制访问

缺点:没有接口,扩展困难

破坏单例模式的方法:序列化与反序列化、克隆、反射、多线程环境

 

原型模式

定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;不需要知道任何创建的细节,不调用构造函数

适用场景:类初始化消耗较多的资源;new产生一个对象需要非常繁琐的过程(数据准备、访问权限等);构造函数比较复杂;循环体中生产大量对象时

优点:原型模式性能比直接new一个对象性能高;建华创建过程

缺点:必须配备克隆方法;对克隆复杂对象或对克隆出的对象进行复制改造时,容易引入风险;深拷贝、浅拷贝运用得当

猜你喜欢

转载自blog.csdn.net/ybbhai/article/details/84979743
今日推荐