1.1 工厂方法
1.1.1 定义
工厂方法是类的创建模式,又叫做虚拟的构子模式或者多态性工厂模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
1.1.2 工厂方法模式的引进
Ø 工厂方法保持了简单工厂的优点,而且克服了它的缺点。
Ø 核心工厂不在负责所有产品的创建,而是将具体创建的工作交给予必须实现的接口。
Ø 进一步抽像的结果,可以在不修改具体工厂角色的情况下,引进新的产品。
1.1.3 角色说明
Ø 抽象工厂角色:工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。
Ø 具体工厂角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
Ø 抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。这个角色也常常使用抽象Java类实现。
Ø 具体产品角色: 这个角色是某个具体产品角色的实例。
1.1.4 源代码
Ø 代码清单1:工厂方法 -- 抽象产品角色类
/* * 创建日期 2006-7-25 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 工厂方法 -- 抽象工厂角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public interface Creator { public Product factory(); } |
Ø 代码清单2:工厂方法 -- 抽象产品角色类
/* * 创建日期 2006-7-25 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 工厂方法 -- 抽象产品角色类 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public interface Product {
} |
Ø 代码清单3:具体工厂角色
/* * 创建日期 2006-7-25 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * *具体工厂角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public class ConcreateCreator1 implements Creator { public Product factory() { return new ConcreteProduct1(); } } |
Ø 代码清单4:具体工厂角色
/* * 创建日期 2006-7-25 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 具体工厂角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public class ConcreateCreator2 implements Creator{ public Product factory() { return new ConcreteProduct2(); } } |
Ø 代码清单5:具体产品角色
/* * 创建日期 2006-7-27 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 具体产品角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public class ConcreteProduct1 implements Product { public ConcreteProduct1() {
} } |
Ø 代码清单6:具体产品角色
/* * 创建日期 2006-7-27 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 具体产品角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public class ConcreteProduct2 implements Product { public ConcreteProduct2() {
} } |
Ø 代码清单7:客户端角色
/* * 创建日期 2006-7-27 * * 描述: * 学习 --> 设计模式 * * 网址: http://www.coolhou.com * */ package com.coolhou.student.designmode.factory.factorymethod;
/** * * 客户端角色 * * @author 李明 * @version v 1.0 * * 修改记录: [年-月-日] [作者] 内容 */ public class Client {
private static Creator creator1, creator2;
private static Product prod1, prod2;
/** * @param args */ public static void main(String[] args) { creator1 = new ConcreateCreator1(); prod1 = creator1.factory(); creator2 = new ConcreateCreator2(); prod2 = creator2.factory(); }
} |
1.1.5 工厂方法模式与简单工厂模式
Ø 工厂方法模式的核心是一个抽象工厂,而简单厂模式把核心放在一个具体类上。
Ø 工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
1.1.6 “开-闭”原则
完全支持“开-闭”原则。
1.1.7 使用Java接口或者Java抽象类的使用原则
抽象工厂角色和抽象产品角色都可以选择由Java接口或者Java抽象类来实现,那么具体选择原则如下:
Ø 如果具体工厂角色和抽象产品角色具有共同的逻辑,那么这些工人同的逻辑就可以向上移动到抽象工厂角色中,这时就需要使用抽象类。
Ø 相反,就应当使用一个Java接口实现。