设计模式(2) ——- 工厂方法模式
- 上一篇关于简单工厂模式的介绍留了点小尾巴,对于简单工厂模式的缺点没有介绍。在这里首先讲一下,然后再利用它来引出 — 工厂方法模式(这算是上次偷懒的好借口吧 O(∩_∩)O~)
- 上一篇 简单工厂模式
概述
简单工厂模式的缺点
简单厂模式的最大缺点 —— 不完全满足 OCP。OCP [开闭原则],其核心思想是:一个类对扩展开方,对修改关闭。说通俗点就是,如果再添加一个新的产品类,不需要修改原来的工厂类就可以正常运行。很明显,简单工厂模式是不满足的,若想保证整个的正常运行必须修改工厂类。
工厂方法模式
工厂方法模式与简单工厂模式的最大不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口(工厂接口)的工厂类。
工厂方法模式的组成
抽象工厂角色
这是工厂方法模式的核心,它与应用程序无关,是具体工厂类必须实现的接口或继承的抽象类。
具体工厂角色
等同于简单工厂模式的。
抽象产品角色
它是具体产品继承的父类或者是实现的接口。
具体产品角色
等同于简单工厂模式的。
工厂方法模式图示
举例说明
案例说明
这里仍然使用简单工厂模式中的例子,具体内容可以去看一下上一篇。
代码
package 工厂方法; public interface Factory { 球员 factory(); } package 工厂方法; public class 篮球Factory implements Factory{ @Override public 球员 factory() { return new 篮球球员(); } } package 工厂方法; public class 足球Factory implements Factory{ @Override public 球员 factory() { return new 足球球员(); } } package 工厂方法; public interface 球员 { void 跑(); void 跳(); } package 工厂方法; public class 篮球球员 implements 球员{ @Override public void 跑() { System.out.println("篮球球员,跑跑跑!"); } @Override public void 跳() { System.out.println("篮球球员,跳跳跳!"); } } package 工厂方法; public class 足球球员 implements 球员 { @Override public void 跑() { System.out.println("足球球员,跑跑跑!"); } @Override public void 跳() { System.out.println("足球球员,跳跳跳!"); } }
说明:很明显,这里与简单工厂模式的不同在于这里添加了一个工厂接口。而且对于该接口有相应几个,每个对应不同产品类的具体工厂类。
好处:假如现在添加乒乓球球员,在工厂方法模式下,只需要添加两个类即可。一个是乒乓球球员类,另一个是乒乓球Factory类【具体代码如下】。而在简单工厂模式下,就需要修改原来的工厂类了,这就不能满足 OCP 原则了。
- 代码
package 工厂方法; public class 乒乓球球员 implements 球员{ @Override public void 跑() { System.out.println("乒乓球球员,跑跑跑!"); } @Override public void 跳() { System.out.println("乒乓球球员,跳跳跳!"); } } package 工厂方法; public class 乒乓球Factory implements Factory{ @Override public 球员 factory() { return new 乒乓球球员(); } }
总结(简单工厂模式与工厂方法模式比较)
客户端编程难度
工厂方法模式在工厂类结构中引入了接口,从而能满足 OCP 原则。但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。
维护角度
显然工厂方法模式较难维护,需要更改多个工厂类。
综述:虽然工厂方法模式更“先进一些”,但总的来说简单工厂模式更好用、更方便些。当然,这只是个人见解。