Design Pattern ——Factory Method&Abstract Factory
2015-12-07 19:14
621 查看
今天开始复习设计模式。设计模式相关的资料有很多,概念性的东西就画个图就可以了。把关注点放在例子上,设计模式还是要使用中才有感受。
从Factory Method&Abstract Factory开始。
我们的例子如下:
我们项目中有一个代码提交记录releasenote,我们需要将这个releasenote分成csv/xls/xml格式分别导出
客户端的调用如下:
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。
抽象工厂模式,就以《java与模式》中的电脑的例子来学习:
我们知道计算机配件的生产是要配套进行的,PC和MAC是完全不同的两条生产过程,CPU RAM也是完全不同
这个例子中产品族有两个,一个是PC,一个是MAC。产品等级结构有两个,一个是RAM,一个是CPU
最后在客户端调用
参考资料:
《Java与模式》
从Factory Method&Abstract Factory开始。
一、Factory Method
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。我们的例子如下:
我们项目中有一个代码提交记录releasenote,我们需要将这个releasenote分成csv/xls/xml格式分别导出
public interface ReleasenoteFactory { public Releasenote exportReleasenote(); }
public interface Releasenote { public void exportFile(); }
public class CSVReleasenoteFactory implements ReleasenoteFactory { @Override public Releasenote exportReleasenote() { // TODO Auto-generated method stub return new CSVReleasenote(); } }
public class CSVReleasenote implements Releasenote { @Override public void exportFile() { csvOperation(); } public void csvOperation(){ System.out.println("CSV"); } }
public class XlsReleasenoteFactory implements ReleasenoteFactory { @Override public Releasenote exportReleasenote() { // TODO Auto-generated method stub return new XlsReleasenote(); } }
public class XlsReleasenote implements Releasenote { @Override public void exportFile() { xlsOperation(); } public void xlsOperation(){ System.out.println("xls"); } }
public class XmlReleasenoteFactory implements ReleasenoteFactory { @Override public Releasenote exportReleasenote() { // TODO Auto-generated method stub return new XmlReleasenote(); } }
public class XmlReleasenote implements Releasenote { @Override public void exportFile() { xmlOperation(); } public void xmlOperation(){ System.out.println("xml"); } }
客户端的调用如下:
ReleasenoteFactory F1 = new CSVReleasenoteFactory(); ReleasenoteFactory F2 = new XlsReleasenoteFactory(); ReleasenoteFactory F3 = new XmlReleasenoteFactory(); F1.exportReleasenote().exportFile(); F2.exportReleasenote().exportFile(); F3.exportReleasenote().exportFile();
二、Abstract Factory
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。
抽象工厂模式,就以《java与模式》中的电脑的例子来学习:
我们知道计算机配件的生产是要配套进行的,PC和MAC是完全不同的两条生产过程,CPU RAM也是完全不同
这个例子中产品族有两个,一个是PC,一个是MAC。产品等级结构有两个,一个是RAM,一个是CPU
public interface ComputerProducer { Cpu createCpu(); Ram createRam(); }
public class MacProducer implements ComputerProducer { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new MacCpu(); } @Override public Ram createRam() { // TODO Auto-generated method stub return new MacRam(); } }
public class PcProducer implements ComputerProducer { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new PcCpu(); } @Override public Ram createRam() { // TODO Auto-generated method stub return new PcRam(); } }
public interface Cpu { public void cpuOperation(); }
public class PcCpu implements Cpu { @Override public void cpuOperation() { System.out.println("Pc Cpu processing!"); } }
public class MacCpu implements Cpu { @Override public void cpuOperation() { System.out.println("Mac cpu processing!"); } }
public interface Ram { public void ramOperation(); }
public class PcRam implements Ram { @Override public void ramOperation() { System.out.println("Pc Ram processing!"); } }
public class MacRam implements Ram { @Override public void ramOperation() { System.out.println("Mac Ram processing!"); } }
最后在客户端调用
public class Client { public static void main(String[] args){ ComputerProducer pcFactory = new PcProducer(); ComputerProducer macFactory = new MacProducer(); Cpu pcCpu = pcFactory.createCpu(); Ram pcRam = pcFactory.createRam(); Cpu macCpu = macFactory.createCpu(); Ram macRam = macFactory.createRam(); pcCpu.cpuOperation(); pcRam.ramOperation(); macCpu.cpuOperation(); macRam.ramOperation(); } }
参考资料:
《Java与模式》
相关文章推荐
- 获得当前屏幕宽和高 [UIScreen mainScreen].bounds.size
- 硬件维修大全
- 微信公众号:微信分享获得配置信息
- 小心情
- 栈
- mysql load data导入数据
- Redis的管理
- duplicate symbol _OBJC_IVAR_$_AppDelegate
- ACM学习历程—CodeForces 601A The Two Routes(最短路)
- 在电脑上上安装了Oracle 11g R2,在用Navicat去连接Oracle时,提示以下错误:
- 简单算法—汉诺塔问题
- Nginx工作原理和优化、漏洞。
- python使用mysql数据库
- LoadRunner监控Apache的步骤
- C++算法实源码分析
- LeetCode9——Palindrome Number
- 计算机领域当前的主流技术及其社会需求调查报告
- mysql 数据库密码的破解方式
- codevs1033 蚯蚓的游戏问题 裸最小费用最大流,注意要拆点
- 基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址