本文借助巨人的肩膀简单总结一下我对工厂模式的理解,理解不到位的地方还请高手指点,谢谢!
一.前言
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
"大话设计模式"中的工厂模式主要分为3类:
①简单工厂模式(Simple Factory Pattern)
②工厂方法模式(Factory Method Pattern)
③抽象工厂模式(Abstract Factory Pattern)
下面简单介绍一下这三种工厂模式。
二.简单工厂模式
简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。
1.简单工厂模式中包含的角色及职责
1)工厂类角色:这是本模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可被外界直接调用,创建所需的产品对象。
2)抽象产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。
2.简单工厂的优缺点
简单工厂的优点
- 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可从直接创建具体产品对象的尴尬局面中摆脱出来。
- 外界与具体类隔离开,降低耦合性。
- 明确区分了各自的职责和权力,有利于整个软件体系结构的优化.
简单工厂的缺点
- 工厂类集中了所有实例的创建逻辑,容易违反高内聚的职责分配原则。
- 虽然简单工厂模式能适应一定的变化,但它所能解决的问题是有限的。它所能创建的类只能是事先考虑到的,如果需要添加新的类,则需改变工厂类了(违背了开发-封闭原则)
三.工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可由工厂方法模式里不同的工厂子类来分担。
1.工厂方法模式中包含的角色及职责
1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口or必须继承的父类。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类or是实现的接口。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
2.工厂方法模式的优缺点
工厂方法模式的优点
- 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主创建何种产品对象。而且如何创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚、低耦合。
- 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,很好的利用了封装和委托。
工厂方法模式的缺点
- 在添加新产品时,需要编写新的具体产品类(其实这是不可避免的),要增加与之对应的具体工厂类,增加了额外的开发量。
四.抽象工厂模式
抽象工厂模式的用意:给客户端提供一个接口,可创建多个产品族中的产品对象而且使用抽象工厂模式还要满足以下条件:
①系统中有多个产品族,而系统一次只可能消费其中一族产品
②同属于同一个产品族的产品以其使用
1.工厂方法模式中包含的角色及职责
1)抽象工厂角色:这是工厂方法模式的核心,与应用程序无关。是具体工厂角色必须实现的接口or必须继承的父类。
2)具体工厂角色:它含有和具体业务逻辑有关的代码,由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类or是实现的接口。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
2.抽象工厂方法的优缺点
抽象工厂的优点:
- 隔离了具体类的生成,客户不需要知道怎样生成了每一个具体产品,什么时间生成的。它将客户与具体的类分离,依赖于抽象类,耦合性低。
- 一个产品族中的多个对象被设计成一起工作,它能够保证客户端始终只使用一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是非常实用的一种设计模式。
- 它有利于更换产品系列,由于客户端只依赖于抽象类,具体类也被写到应用程序配置文件中,更换产品系列时,只须更改一下具体工厂名就行了。
抽象工厂的缺点
- 难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。