浅析设计模式系列之二——简单工厂模式
基本简介
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
意图:
提供一个类,由它负责根据一定的条件创建某一具体类的实例。
该模式中包含的角色及其职责
1) 工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2) 抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3) 具体产品(Concrete Product)角色
简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。 一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。
UML图:
例子:
实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
分析:根据运算符号的不同,进行的运算是不一样的,但他们都其实属于同一个抽象(抽象产品),他们都可以从一个接口中派生出来,你需要哪一个,就向工厂描述一下这种运算的特征,工厂就会为你生成一个具体的产品类,你就可以使用了。
抽象产品类代码:
具体产品类代码:
工厂类代码:
客户端调用代码:
到这里,代码就完成了。
优点:
- 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,客户端可以避免直接new一个对象产品。
- 可扩展性强,当需要增加新的运算功能时,只需再继承IOperate产生具体的产品类,然后在工厂中加入即可。
- 外界与具体类隔离开来,偶合性低。增加新的功能时,不需要去修改原有功能。
- 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:
- 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则。
- 当增加一个新的功能时,即增加一个具体的产品类之后,需要更改工厂类的实现,这违反了开放-闭合原则(下一章工厂方法模式将介绍如何解决这个问题)。
应用情景:
- 工厂类负责创建的对象比较少
- 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心
参考资料:
《大话设计模式》 程杰 清华大学出版社