工厂方法模式介绍
工厂方法模式(Factory Pattern),是创建型设计模式之一。是一种结构简单的模式,在平时开发中应用很广泛。如Android中Activity里的各个生命周期方法,以onCreate方法为例,它可以看作成一个工厂方法,我们在其中可以构造我们的view,并通过setContentView返回给framework处理。
工厂方法模式的定义
定义一个创建对象的接口,让子类决定实例化哪个类
工厂方法模式的使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂方法,用new就可以完成创建的对象无需使用工厂模式。
工厂方法模式的UML图
角色介绍:
- Factory:抽象工厂,为工厂模式的核心
- ConcreteFactory:具体工厂,实现具体的业务逻辑
- Product:抽象产品,是工厂方法模式所创建的产品的父类
- ConcreteProduct:具体产品,是实现抽象产品的某个具体产品的对象
根据图可以得出如下一个工厂方法模式的通用代码。
1 | /** |
1 | /** |
1 | /** |
1 | /** |
1 | /** |
1 | /** |
上述代码中在Client类中构造了一个产品对象,这时候得到的产品对象是ConcreteProductA的实例,如果想要得到ConcreteProductB的实例的话,直接在ConcreteFactory中的逻辑即可。
1 | public class ConcreteFactory extends Factory { |
有时我们还利用反射的方式更加简洁的来生产具体的产品对象,此时工厂方法的参数列表中就得传入一个class类来决定生产哪个产品
1 | public abstract class Factory { |
对于具体的工厂类,则通过反射获取类的实例即可
1 | public class ConcreteFactory extends Factory { |
最后来看看Client的实现
1 | public class Client { |
工厂方法模式的简单实现
场景:小渊是一家组装电脑厂的厂长,主要的生产的电脑品牌有联想、戴尔、苹果三种,由于组装三种电脑的流程差不多,故对小渊来说,一条生产线足以应对3种品牌。故对于该类生产线小渊定义了一个抽象类定义:
1 | /** |
1 | ** |
具体的产品类以及具体产品类如下:
1 | /** |
1 | /** |
1 | /** |
1 | /** |
最后来看看客户端的实现:
1 | /** |
输出结果如下:
联想电脑开机了
联想电脑关机了
苹果电脑开机了
苹果电脑关机了
戴尔电脑开机了
戴尔电脑关机了
总结
- 优点 :降低了对象之间的耦合度,而且工厂方法模式依赖于抽象的架构,其实例化的任务交由子类完成,故具扩展性。
- 缺点:每次我们为工厂方法模式添加新产品时就要编写一个新的产品类,同时引用抽象层,会导致类结构的复杂化,故在某些简单情况下,是否使用工厂方法模式就得权衡。