简单工厂模式:
一个系列产品,这些产品有一个公共的基类 Product,提供统一的接口,这个公共基类本身不表示任何现实中的实体。
采用继承,会有该系列产品的很多子产品ProductA, ProductB, ProductC…,每一个子类对应一个实际的现实工厂中的实体
一个工厂实例对象SimpleFactory,或者一个工厂类(提供一个公用的静态函数):这个工厂内部有参数判断,根据参数不同来创建不同的子类产品对象。
场景:客户不用再去子集去new ProductA, new ProductB等实例化对象,只用使用工厂提供的GetProcuct()函数就可以
工厂模式:
简单工厂是一个工厂,根据输入参数条件判断,在这一个工厂里面调用不同的实例化函数,来创建不同的实体。所有实体的创建都是在这一个工厂内进行,可以认为这个简单工厂是一个大杂烩,这一系列的所有产品都能生产。
工厂模式就是对之前的简单工厂的专业化处理,之前只有一个工厂(可以理解为母工厂),生产的产品不精,不够专业。之后母工厂下创建了几个子工厂(继承)。有几个产品就创建几个子工厂,每个子工厂就只能生产这一个产品。外部客户给母工厂下订单(传入参数,想要返回对象),母工厂根据需求(参数),下发给不同的子工厂,子工厂再去生产产品(创建产品对象)。
相当于生产下放(将创建对象的操作放在子工厂里面)。
之前只有一个母工厂(简单工厂)时,我们添加新的产品(子类)需要更改母工厂的判断逻辑,这样违反了程序开发的开闭原则。但是使用了工厂模式后,我们添加新的产品(子类)只需要添加一个子工厂,母工厂基本不变(多一个判断条件)
抽象工厂模式:
之前工厂模式所有的产品只有一个基类,也就是都是一个系列的。当我们有多个系列的产品时(有多个产品的基类,每个基类有很多子类产品),需要使用抽象工厂。
之前的工厂模式就是母公司只有一个产品(一个对外窗口,GetProduct(),在这一个窗口中通过不同的要求获取该系列的不同产品)。现在有多个系列的产品,那就是母公司开放了多个对外窗口(GetProduct(), GetProductAA(), GetProductBB()),不同的窗口获取不同系列的产品
总结:
工厂模式大部分情况用不到。可以不看。
设计原则
设计模式的八个原则:
- 依赖倒置原则:高层次的代码(稳定)不应该依赖低层次的代码(变化)、抽象的代码不应该依赖具体的代码。
- 开放封闭原则:类模块应该开放扩展的,而其原先的代码尽量封闭不可改变。
- 单一职责原则:一个类应该仅有一个变化的原因,该变化隐含了它的职责,职责太多时会导致扩展时对代码东拉西扯,造成混乱。
- 替换原则:子类必须能够替换它的基类(IS-A),继承可以表达类型抽象。
- 接口隔离原则:接口应该小而完备,不该强迫用户使用多余的方法。
- 优先使用组合而不是继承:继承通常会让子类和父类的耦合度增加、组合的方式只要求组件具备良好定义的接口。
- 封装变化点:
- 针对接口编程,而不是针对实现编程
其他的解决创建对象问题的模式
原型模式
当一个对象创建不能用简单的new来实现,而是需要经过一些复杂的步骤来改变一些初始状态时,可以使用原型模式来创建对象。
基本思路:已有一个类对象(有很多状态,可以叫做原型),我们想根据此时状态下的原型对象来创建新的对象。就不再需要繁琐的步骤去修改到这个状态,这就叫做原型模式。
主要使用的方法是,将原型对象指针传给一个类,类里面对这个原型对象指针做深拷贝(拷贝构造函数),此时就会构建出一个新的同样状态的对象,创建就完成了。
注:实际工程中基本不用
构建器模式
将一个复杂对象的构建和表示分析,使用同样的构建流程(稳定)可以有不同的表现形式(变化)。
父类实现构建的流程(稳定的部分),子类实现流程中的步骤(不同的子类步骤实现内容不同),类似于模板方法,但是模板父类中的函数或者流程是功能函数,而构建器中的函数为构造函数。