设计模式之工厂方法模式
2015-12-10 11:24
183 查看
模式定义:
定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象。将实际创建实例对象
的工作延迟到子类当中,核心工厂类不再负责具体产品的创建。
工厂方法模式是对简单工厂模式的抽象。好处是可以使系统在不修改工厂角色的情况下引进新
的产品。属于创建型模式。
遵循原则:
开闭原则
依赖倒置
适用场合:
(1)当子类型可能很多,以后需要添加不同的子类实现时;
(2)当一个系统还在设计阶段,还不知道将来需要实例化哪些具体类时;
(3)系统设计之初不需要知道具体对象的概念或者不知道。
知识扩展:
JDK的List、LinkedList、ArrayList就有工厂方法的影子。List返回一个iterator接口
LinkedList、ArrayList返回具体的迭代器。
定义抽象产品
/**
* 定义抽象宝刀
* @author 熊诗言
*
*/
public abstract class AbstractSword {
private String name;
public AbstractSword() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
两种具体的宝刀
public class QixingSword extends AbstractSword {
public QixingSword() {
this.setName("七星宝刀");
}
}
public class BaxingSword extends AbstractSword {
public BaxingSword() {
this.setName("八星宝刀");
}
}
定义一个产生产品的工厂接口,生产的产品是抽象的
public interface ISwordFactory {
public AbstractSword createSword();
}
定义两个具体的工厂
public class CaoCao implements ISwordFactory {
@Override
public AbstractSword createSword() {
// TODO Auto-generated method stub
return new QixingSword();
}
}
public class CaoCao2 implements ISwordFactory {
@Override
public AbstractSword createSword() {
// TODO Auto-generated method stub
return new BaxingSword();
}
}
客户端
就可以面向接口编程
public class MainApp {
public static void main(String[] args) {
// ISwordFactory isf = new CaoCao();
// AbstractSword as = isf.createSword();
// System.out.println("曹操使用 "+as.getName()+" 刺杀董卓");
ISwordFactory isf = new CaoCao2();
AbstractSword as = isf.createSword();
System.out.println("曹操2使用 "+as.getName()+" 刺杀董卓");
}
}
定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象。将实际创建实例对象
的工作延迟到子类当中,核心工厂类不再负责具体产品的创建。
工厂方法模式是对简单工厂模式的抽象。好处是可以使系统在不修改工厂角色的情况下引进新
的产品。属于创建型模式。
遵循原则:
开闭原则
依赖倒置
适用场合:
(1)当子类型可能很多,以后需要添加不同的子类实现时;
(2)当一个系统还在设计阶段,还不知道将来需要实例化哪些具体类时;
(3)系统设计之初不需要知道具体对象的概念或者不知道。
知识扩展:
JDK的List、LinkedList、ArrayList就有工厂方法的影子。List返回一个iterator接口
LinkedList、ArrayList返回具体的迭代器。
定义抽象产品
/**
* 定义抽象宝刀
* @author 熊诗言
*
*/
public abstract class AbstractSword {
private String name;
public AbstractSword() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
两种具体的宝刀
public class QixingSword extends AbstractSword {
public QixingSword() {
this.setName("七星宝刀");
}
}
public class BaxingSword extends AbstractSword {
public BaxingSword() {
this.setName("八星宝刀");
}
}
定义一个产生产品的工厂接口,生产的产品是抽象的
public interface ISwordFactory {
public AbstractSword createSword();
}
定义两个具体的工厂
public class CaoCao implements ISwordFactory {
@Override
public AbstractSword createSword() {
// TODO Auto-generated method stub
return new QixingSword();
}
}
public class CaoCao2 implements ISwordFactory {
@Override
public AbstractSword createSword() {
// TODO Auto-generated method stub
return new BaxingSword();
}
}
客户端
就可以面向接口编程
public class MainApp {
public static void main(String[] args) {
// ISwordFactory isf = new CaoCao();
// AbstractSword as = isf.createSword();
// System.out.println("曹操使用 "+as.getName()+" 刺杀董卓");
ISwordFactory isf = new CaoCao2();
AbstractSword as = isf.createSword();
System.out.println("曹操2使用 "+as.getName()+" 刺杀董卓");
}
}
相关文章推荐
- ios读书笔记
- 创建型设计模式
- JavaEE_Mybatis_SpringMVC_ Springmvc 数据回显 通过 ModelAndView向前台传值
- 生成XML文件的步骤 & 解析XML文件
- 机器学习:分类与回归(classify and regression)
- GDB调试php扩展错误(Segmentation fault (core dumped))
- std::vector::iterator重载了下面哪些运算符
- org.apache.lucene.queryParser.ParseException: Encountered "<EOF>" at line 1, column 0.
- linux之eval用法(高级bash程序员的必修之技)
- 大型网站子系统简介
- 静态编译内核添加驱动(ARM7)
- 【杭电oj】2037今年暑假不AC(贪心算法)
- 生成XML文件的步骤
- DNS编程实验--域名与IP的相互转换
- java 类继承中涉及到的构造器问题
- 《HTTP权威指南》– 4.HTTP连接管理
- centos 7用ss命令来查看端口占用和对应进程
- 从头认识java-13.2 利用元组的方式返回多类型对象
- iOS UIBezierPath 通过贝塞尔曲线画圆环 创建一个环形进度指示器
- eclipse打开当前文件所在文件夹的两种方法