一 模式定义
一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。
二 模式举例
1 模式分析
我们借用三国中曹操献刀来说明这一模式的运用。抽象之后的关系如下图。
2 工厂方法模式的静态建模
大司徒王允—生成宝刀的抽象工厂
校尉曹操—具体工厂生产七星宝刀
各类宝刀—抽象产品
七星宝刀—具体产品七星宝刀
3 代码示例
3.1 建立产品
抽象宝刀——AbstractSword
package com.demo.factory.model; /** * 定义抽象宝刀 * * @author Administrator * */ public abstract class AbstractSword { // 宝刀的名字 private String name; // 抽象父类的构造方法 public AbstractSword() { } // 获得宝刀名字 public String getName() { return name; } // 设置宝刀名字 public void setName(String name) { this.name = name; } }
具体宝刀——QixingSword七星宝刀
package com.demo.factory.model.object; import com.demo.factory.model.AbstractSword; /** * 七星宝刀类 * * @author * */ public class QixingSword extends AbstractSword { /** * 构造方法设置宝刀的名称 */ public QixingSword() { this.setName("七星宝刀"); } }
3.2 建立工厂
抽象宝刀工厂——ISwordFactory 生产抽象宝刀
package com.demo.factory.itf; import com.demo.factory.model.AbstractSword; /** * 宝刀工厂 * * @author Administrator * */ public interface ISwordFactory { /** * 生产各类宝刀(返回值是抽象宝刀类型) * * @return */ public AbstractSword createSword(); }
具体宝刀工厂——Caocao 生产七星宝刀
package com.demo.factory; import com.demo.factory.itf.ISwordFactory; import com.demo.factory.model.AbstractSword; import com.demo.factory.model.object.QixingSword; /** * 曹操具体工厂 * * @author * */ public class Caocao implements ISwordFactory { /** * 实现ISwordFactory接口的createSword方法,生产七星宝刀 */ public AbstractSword createSword() { return new QixingSword(); } }
3.3 故事情节的历史重现
package com.demo; import java.util.HashMap; import java.util.Map; import com.demo.factory.Caocao2; import com.demo.factory.itf.ISwordFactory; import com.demo.factory.model.AbstractSword; public class MainApp { /** * @param args */ public static void main(String[] args) { // 创建曹操实例对象(返回使用接口类型 ISwordFactory) ISwordFactory swordFactory = new Caocao(); //ISwordFactory swordFactory = new Caocao2(); // 获得宝刀实例——八星宝刀 AbstractSword sword = swordFactory.createSword(); // 刺杀董卓 System.out.println("曹操使用" + sword.getName() + "刺杀董卓!"); } }
运行结果:
曹操使用七星宝刀刺杀董卓!
3.4 用八星宝刀来考验模式
创建八星宝刀-——BaxingSword
package com.demo.factory.model.object; import com.demo.factory.model.AbstractSword; /** * 八星宝刀类 * * @author * */ public class BaxingSword extends AbstractSword { /** * 构造方法设置宝刀的名称 */ public BaxingSword() { this.setName("八星宝刀"); } }
创建具体宝刀工厂——Caocao2 生产八星宝刀
package com.demo.factory; import com.demo.factory.itf.ISwordFactory; import com.demo.factory.model.AbstractSword; import com.demo.factory.model.object.BaxingSword; /** * 使用八星宝刀的曹操具体工厂 * * @author * */ public class Caocao2 implements ISwordFactory { // 生产八星宝刀 public AbstractSword createSword() { return new BaxingSword(); } }
让曹操使用八星宝刀刺杀董卓
package com.demo; import java.util.HashMap; import java.util.Map; import com.demo.factory.Caocao2; import com.demo.factory.itf.ISwordFactory; import com.demo.factory.model.AbstractSword; public class MainApp { /** * @param args */ public static void main(String[] args) { // 创建曹操实例对象(返回使用接口类型 ISwordFactory) //ISwordFactory swordFactory = new Caocao(); ISwordFactory swordFactory = new Caocao2(); // 获得宝刀实例——八星宝刀 AbstractSword sword = swordFactory.createSword(); // 刺杀董卓 System.out.println("曹操使用" + sword.getName() + "刺杀董卓!"); } }
运行结果:
曹操使用八星宝刀刺杀董卓!
三 该模式使用到的设计原则
- “开-闭”原则:一个软件实体应该对扩展开放,对修改关闭。我们在设计软件模块的时候应该使这个模块可以在不被修改的前提下被扩展。
- 依赖倒置原则:不论工厂还是产品都应该依赖于抽象,而不是具体的实现类。
四 使用场合
- 当子类型可能会有很多,以后需要不断增添不同的子类实现时。
- 当一个系统还在框架设计阶段,还不知道将来需要实例化哪些具体类时。
- 系统设计之初不需要具体对象的概念(或者没有具体对象的概念)
相关推荐
根据工厂方法模式的理论,使用C#语言写的两个模式应用案例,有助于设计模式的理解和学以致用。
设计模式 c# 工厂方法模式
工厂方法模式定义: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. 定义一个用于创建对象...
通过实际例子说明工厂方法模式,并解释工厂方法的原理,特点和使用场景。
该文件时对简单工厂模式的简单应用小例子,里面包含了对应的源代码
单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那
这个是http://blog.csdn.net/dawanganban/article/details/9884681博客中java设计模式的源代码。下载前请先看《设计模式——工厂模式在开发中的应用》一文。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 结合简单工厂模式 完成的小应用
自创源码,对java设计模式中的工厂方法,抽象工厂方法的应用,在例中,实现了馅饼店的构建,开分店的构建,完全遵守了设计原则,程序易扩展,开分店,以及创建新的馅饼种类,都不用对原有代码做大的更改
1)程序功能:用简单工厂模式实现计算器功能,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/45692995。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目应用...
学习工厂模式的一个小练习,便于理解哦:计算器(应用工厂模式)
处理层的设计采用了设计模式中的策略模式、模板方法模式和工厂模式。 Server端和Client端的实现也采用了分层的设计方式,包含自定义的模型层、视图层和控制层。 说明:程序采用配置文件的方式进行初始化,运行时时请...
作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”。对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由...
抽象工厂模式的核心是提供一个抽象的工厂接口,该接口定义了一组用于创建产品的方法,而不需要指定具体的类。具体的工厂类继承该接口,并实现了这些方法以创建具体的产品。 抽象工厂模式的优点包括: * decoupling...
工厂方法模式设计的汽车保险管理应用程序实例.pdf
使用spring框架,工厂模式的IoC应用,非常简单的小例子。
介绍工厂方法模式(Factory Method Pattern),是创建型设计模式之一。工厂方法模式是一种结构简单的模式,应用很广泛。定义定义一个用于创建对象的
工厂方法模式设计的汽车保险管理应用程序实例.doc