工厂方法模式
2016-07-14 09:03
274 查看
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
工厂方法模式(Factory Method):定义一个用于创建对象的接口IFactory,在具体的ConcreteFactory子类
中根据传进的参数即具体子类ConcreteProduct决定实例化哪一个IProduct产品,该模式使得一个类(即IProduct)
的实例化延迟到其子类(即ConcreteProduct)。
结构图:
具体代码:
// 产品接口,定义一系列产品应该实现的服务,即产品的共性 interface IProduct { public void method01(); public void method02(); } // 具体的产品实现类 class ConcreteProductA implements IProduct { public void method01() { System.out.println("ConcreteProductA method01() ..."); } public void method02() { System.out.println("ConcreteProductA method02() ..."); } } class ConcreteProductB implements IProduct { public void method01() { System.out.println("ConcreteProductB method01() ..."); } public void method02() { System.out.println("ConcreteProductB method02() ..."); } } // 抽象的工厂类,定义了其子类必须实现的createProduct()方法 abstract class Factory { //运用了Java 中的泛型和反射技术 public abstract <T extends IProduct> T createProduct(Class<T> c); } class ConcreteFactory extends Factory { public <T extends IProduct> T createProduct(Class<T> c) { T product = null; try { product = (T) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return product; } } public class Client { public static void main(String[] args) { //创建一个具体工厂 Factory factory = new ConcreteFactory(); //根据参数中具体产品的.class名称来决定创建的产品类型 IProduct product01 = factory.createProduct(ConcreteProductA.class); IProduct product02 = factory.createProduct(ConcreteProductB.class); product01.method01(); product01.method02(); product02.method01(); product02.method02(); } }
实际上,具体的产品子类(即ConcreteProduct)可以有多个,以上只用了两个;而且具体的工厂(即ConcreteFactory)
也可以有多个,不同的工厂可以提供不同的创建产品的实现方式,即使用不同的方式来覆盖实现父类中的抽象createProduct()方法。
我们可以将工厂方法模式中的产品理解为对外的服务,而IProduct接口仅仅只是制定一个标准,即每个产品(服务)
必须对外提供的接口(这个“接口”是概念上的,不是上面那种编程语言级别的关键字interface“接口”)。
总结:
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 |
相关文章推荐
- Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料
- wampserver 主页里点击“Your Projects”下面项目名,显示错误的问题
- 关于网络上的各种mysql性能测试结论
- Spring4.0系列9-websocket简单应用
- C#计算程序执行速度
- 清除远程桌面连接记录
- Hive metastore database is not initialized. Please use schematool(...) to create the schema.
- 欢迎使用CSDN-markdown编辑器
- KSFramework常见问题:Lua脚本热重载,内存状态数据丢失?
- Trapping Rain Water
- java 基础IO/inputStream/outputStream/buffInputStrem/buffOutputStrem
- 如何在MakeFile中执行shell脚本文
- Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理
- Android 通用ListView、GridView适配器
- 每天一个linux命令(48)--ln命令
- IIS大数据请求设置方法
- IIS Server is too busy 解决方法(IIS6)
- java流程控制
- 关于ajax网络请求的封装实例
- java常用排序算法