一. 工厂方法模式
我们知道简单工厂模式的应用就是用来创建一个对象,简单工厂模式是将所有对象的初始化集于一个具体的工厂类来实现,这个工厂类负责所有产品的创建,但是这种创建只能创建单一的产品,如简单工厂模式里的ChickenFactory这种工厂只能生产鸡肉这个系列的产品,而当需求发生变化时简单工厂模式就无法应对了。
例如:我再一次带MM光临了麦当劳时,这次MM不想吃鸡翅了,而是选择了吃汉堡,可见这个时候ChickenFactory无法满足客户需要了,需要做出更改,方法就是再加一个工厂类:HamburgerFactory该类负责创建汉堡系列产品,这种方法造成的直接结果就是每一种产品都需要一个具体的工厂类,造成工厂过多,客户端使用不方便,因为我带MM去麦当劳不能由MM或者我决定鸡翅和汉堡是怎么生产出来的,我们只需要跟服务员说一声吃什么就可以了。 而工厂方法模式正是解决这种弊端而出现的,在工厂方法模式里,由一个抽象工厂类负责所有产品的创建,工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
二. 举例:
此模式涉及到的角色:
抽象工厂角色(McDonaldFactory)
具体工厂角色(ChickenFactory, HamburgerFactory)
抽象产品角色(Product)
具体产品角色(ChickenWing, BeefHamburger)
- /**
- * 抽象工厂类
- * @author Administrator
- *
- */
- public interface McDonaldFactory {
- public Product factory();
- }
- /**
- * 鸡肉工厂类,负责鸡肉类产品的创建
- * @author Administrator
- *
- */
- public class ChickenFactory implements McDonaldFactory {
- @Override
- public Product factory() {
- return new ChickenWing();
- }
- }
- /**
- * 汉堡产品类,负责汉堡系列产品的创建
- * @author Administrator
- *
- */
- public class HamburgerFactory implements McDonaldFactory {
- @Override
- public Product factory() {
- return new BeefHamburger();
- }
- }
- /**
- * 抽象产品类,提供统一的接口
- * @author Administrator
- *
- */
- public interface Product {
- public void price();
- }
- /**
- * 具体产品,鸡翅实现了父接口的price()方法
- * @author Administrator
- *
- */
- public class ChickenWing implements Product{
- @Override
- public void price() {
- System.out.println("鸡翅:2$...");
- }
- }
- /**
- * 具体产品类,实现了父接口中的price()方法
- * @author Administrator
- *
- */
- public class BeefHamburger implements Product{
- @Override
- public void price() {
- System.out.println("牛肉汉堡: 4$...");
- }
- }
客户端调用:
- McDonaldFactory cf = new ChickenFactory();
- cf.factory().price();
- McDonaldFactory bh = new HamburgerFactory();
- bh.factory().price();
三. 总结:工厂方法模式的核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,进负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应该被实例化这种细节,这使得工厂方法模式可以用来允许在不修改具体工厂角色的情况下引进新的产品,这一特点使得他具有超过简单工厂模式的优越性。