首页 > 代码库 > 设计模式之创建型模式
设计模式之创建型模式
一、前言
设计模式应该是在软件工程的背景下进行讨论的,而不是为了设计模式而论设计模式。设计模式是软件工程面向对象设计工作中一个抽象、归纳、总结的过程。软件设计的最高目标和最高准则就是易扩展,易复用,易维护,
灵活性高,高可用,稳定性高一切的设计原则和设计模式最终的目标都是向这个目标靠拢的。
二、面向对象设计六大原则
任何的设计模式都是基于面向对象的特性(抽象、封装、继承、多态)和设计原则进行设计和实现的,是面向对象设计原则的在不同场景下的实现方案。
抽象:抽离变化的部分,引入抽象层,实现具体实现类(某一变化)与使用场景分离,降低耦合度,易扩展
封装:
继承:
多态:
设计原则 | 内容 | 备注 | 目标 |
单一职责原则 (SRP) | 就一个类而言,应该仅有一个引起它变化的原因。一个类只担负一种职责,以降低职责之间的耦合度,提供当前代码的复用性 | 严格遵循了高内聚低耦合的指导方针 用于实现对类的粒度大小进行控制 | 可复用、易维护 |
开放封闭原则 (OCP) | 软件实体(类、模块、方法等)应该可以扩展,但是不可以修改。一个软件实体应该对扩展开发,对修改关闭,即软件实体应该尽量在不修改原有的代码下进行扩展。 目标是是即能在严格保证当前软件系统稳定性的前提下,又能够实现对软件系统根据业务需求不断进行扩展。 | 将软件中变化的部分抽离出来,在使用场景中使用抽象化代替(降低具体实现类与使用场景的耦合度),而将具体的变化的细节封装在不同的实现类中,实现在不修改原有代码只需要将新增变化的部分扩充至抽象化内。 | 稳定,易扩展 |
依赖倒转原则 ( DIP) | 抽象不应该依赖于细节,细节应该依赖于抽象。即要针对接口编程,而不是针对实现编程。 | 依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。 将变化的部分抽离出来用抽象类代替,降低变化的部分与其他不变化部分的耦合度。 | 可扩展 |
里氏替换原则 (LSP) | 所有引用基类(父类)的地方必须能透明地使用其子类的对象。 | 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。 | |
迪米特原则 (LoD) 最少知识原则(LKP) | 一个软件实体应当尽可能少地与其他实体发生相互作用 如果两个类不必彼此直接通信,那么这两个类就不应当直接的相互引用。如果其中的一个类需要调用另外一个类的某一个方法的话,可以通过第三者转发这个调用。(通过第三方来降低两个类之间的耦合度) | 在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。 | 可复用 |
接口隔离原则 (ISP) | 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。 | 在使用接口隔离原则时,我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。 |
三、创建型模式概述
四、创建型模式内容
1、简单工厂模式
(1)功能
定义一个创建对象的接口,封装了根据客户端选择动态的实例化相关类。简单工厂模式使创建对象的逻辑都封装在一个方法里面。更多是一种编程习惯模式,而不是设计模式。
(2)适用性
(3)结构
(4)参与者
(5)优缺点
优点:简单工厂类的方法里面包含了具体的逻辑判断,根据客户端的条件选择动态实例化相关的类,对客户端来说解除了与具体实现了的耦合。
缺点:没有遵循开放-封闭原则。新增新的实现类的是需要修改简单工厂类里面的逻辑判断。
2、工厂方法模式
(1)功能
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
(2)适用性
1)当一个类希望由他的子类来指定它所创建的对象的时候(即希望实例化的操作推迟到子类中)
2)当一个类不知道它所必选创建的对象的类的时候
(3)结构
(4)参与者
Product:所有具体实现类的接口,也是工厂方法所创建的对象的接口。
ConcreteProduct:继承于Product的具体对象类
Creator:声明工厂方法,返回一个Product类型的对象.可以是一个抽象类且不提供所声明工厂方法的实现,或者也可以是一个具体的类,工厂方法提供一个缺省的实现
ConcreteCreator:继承于Creator,用于创建返回ConcreteProduct实例的具体工厂方法类
(5)优缺点
1)优点:向客户端隐藏了对象实例化的细节。添加新的类不需要修改原来抽象对象和抽象工厂提供的接口,也无需修改客户端代码新增具体的实现类和具体的工厂类即可,严格遵循了开放封闭原则。
2)缺点:需要依赖客户端决定实例化哪一个工厂类。工厂方法把简单工厂内部的逻辑判断移动到了客户端来进行。每新增一个具体的实现了,就需要新增一个该类的具体工厂方法类。
(6)相关模式
1)简单工厂模式:
2)抽象工厂模式
3)模板方法模式
4)原型模式
3、原型模式
(1)功能
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式就是从一个对象在创建另外一个可定制的对象,而且不需要指定任何创建的细节。
(2)适用性
1)当一个系统应该独立于它的产品创建,构成、表示时,使用原型模式
2)当要实例化的类时运行时刻指定时
3)为了避免创建一个和产品类层次平行的工厂类层次的时候
4)当一个类的实例只能有几个不同的状态组合中的一种时。
(3)结构
(4)参与者
Prototype:所有具体原型类的抽象接口,声明了一个克隆自己的接口
ConcretePrototype:实现Prototype接口的具体原型类,并实现了克隆自身的操作
Client:客户端 ,使用原型的地方,
(5)优缺点
1)优点:
a.当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率
b.不用构造一个与产品类层次平行的工厂类
c.可以运行时增加和删除产品
2)缺点:
a.需要每个类实现Clone操作,可能存在困难
(6)相关模式
1)抽象工厂模式
抽象工厂可以存储一个被克隆的原型的集合并返回产品对象。
2)组合模式
3)装饰模式
4、生成器模式(建造者模式)
(1)功能
生成器模式(建造者模式):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
(2)适用性
建造者模式使当创建复杂对象的算法应该独立于对象的组成部分以及它们的装配方式时适用的模式
1)对象复杂的构建过程应该独立于对象的表示时候
2)构造过程允许构造对象有不同的表示时
(3)结构
(4)参与者
(5)优缺点
1)优点:
a.将对象的构造过程与对象的表示分离开来,建造者隐藏了对象是如何构造的,如果需要修改对象内部表示只需要在定义一个具体的建造者就可以了
b.统一对象的构造过程
2)缺点:
(6)相关模式
5、抽象工厂模式
(1)功能
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们的具体类型。
(2)适用性
1)当一个系统应该独立于它的产品创建,构成、表示时
2)一个系统中存在多个产品系列并由其中的一个配置时
(3)结构
(4)参与者
AbstractProduct:表示系列产品中的一个类型的产品的接口
Product:表示实现AbstractProduct接口的产品,是被具体工厂创建并返回的对象
AbstractFactory:一个创建抽象产品对象的接口
ConcreteFactory:表示实现AbstractFactory接口的具体工厂类,创建具体产品并返回具体产品的实现类。
(5)优缺点
1)优点:
a.易于交换产品系列,通过改变具体工厂类就可以使用不同的产品配置
b.具体实例的创建过程与客户端分离,产品的具体类与客户端分离。
2)缺点:
a.新增产品系列和产品类型的需要增加产品类,具体工厂类等,需要增加很多的类
b.需要依赖客户端决定实例化哪一个具体工厂类
(7)相关模式
1)工厂方法模式:抽象工厂通常使用工厂方法实现
2)原型模式:抽象工厂也可以使用原型模式创建
3)单例模式:一个具体的工厂通常是一个单例
6、单例模式
(1)功能
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
(2)适用性
1)一个类只有一个实例的时候而且可以从一个众所周知的访问点访问它时
(3)结构
(4)参与者
(5)优缺点
(6)相关模式
1)抽象工厂:可以使用单例模式实现
2)生成器模式:可以使用单例模式实现
3)原型模式:可以使用单例模式实现
五、总结
创建型模式 | 特性 | 变化的部分与不变的部分 |
简单工厂模式 | 包含一个产品类的层次结构和一个单独的封装了根据客户端选择动态实例化的工厂类 | |
工厂方法模式 | 产品类与具体工厂类层次平行 | |
抽象工厂模式 | 工厂方法模式在一系列产品下的扩展。存在多个产品类层次 | |
单例模式 | ||
原型模式 | ||
生成器模式 | 变化部分:对象的表示部分 不变的部分:复杂对象的构建过程 |
设计模式之创建型模式