今天开始复习设计模式。设计模式相关的资料有很多,概念性的东西就画个图就可以了。把关注点放在例子上,设计模式还是要使用中才有感受。

从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与模式》

Design Pattern ——Factory Method&Abstract Factory的更多相关文章

  1. simple factory, factory method, abstract factory

    simple factory good:1 devide implementation and initialization2 use config file can make system more ...

  2. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  3. Simple Factory vs. Factory Method vs. Abstract Factory【简单工厂,工厂方法以及抽象工厂的比较】

    I ran into a question on stackoverflow the other day that sort of shocked me. It was a piece of code ...

  4. C++ Design Pattern: What is a Design Pattern?

    Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...

  5. 设计模式之美:Abstract Factory(抽象工厂)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...

  6. 大话设计模式--工厂方法模式 Factory Method -- C++实现

    1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...

  7. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  8. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  9. Design Pattern ->Factory Method

    Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...

随机推荐

  1. HTML5 input控件 placeholder属性

    placeholder 属性提供可描述输入字段预期值的提示信息(hint),该提示会在输入字段为空时显示,并会在字段获得焦点时消失. <input placeholder="请输入姓名 ...

  2. CentOS 5.6服务器配置YUM安装Apache+php+Mysql+phpmyadmin

    1. 更新系统内核到最新. [root@linuxfei ~]#yum -y update 系统更新后,如果yum安装时提示错误信息,请执行以下命令修复. [root@linuxfei ~]#rpm ...

  3. php防止sql注入函数

    $magic_quotes_gpc = get_magic_quotes_gpc(); @extract(daddslashes($_COOKIE)); @extract(daddslashes($_ ...

  4. xml中的特殊符号

    其实就是xml的特殊符号,因为它的配置就是xml,所以可以用下面这种写法转义 <          <     >          >      <>   < ...

  5. 快速排序(Quick Sort)的C语言实现

    快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...

  6. cocos2d-x lua脚本开发 1

    自从开始关注OpenResty之后,逐渐关注Lua语言,发现这个语言真真是容易让人喜爱的语言.偶然间发现了cocos2d-x,还支持lua,所以果断尝试一下. 这里是在cocos2d-x官方网站下载了 ...

  7. 转:Node.js异步处理CPU密集型任务的新思路

    原文来自于:http://www.infoq.com/cn/articles/new-idea-of-nodejs-asynchronous-processing-tasks?utm_source=i ...

  8. Matlab 数理统计

    1.离散随机分布 超几何分布:M:产品总数;K:次品数;N:抽样数. hygepdf(X, M,K,N):计算超几何分布的密度. 例:hygepdf(1,10,1,3),执行结果为ans=0.3000 ...

  9. poj 1195Mobile phones

    http://poj.org/problem?id=1195 #include <cstdio> #include <cstring> #include <algorit ...

  10. 彻底卸载 RAD Studio 2009/2010/XE+ 的步骤

    重新安装 RAD 系列时,建议将上一个版本彻底卸载,彻底卸载 RAD Studio 2009/2010/XE+ 的步骤: 控制面板-->添加/删除程序中执行了卸载操作以后, 还需要做以下工作: ...