Design Pattern ——Factory Method&Abstract Factory
今天开始复习设计模式。设计模式相关的资料有很多,概念性的东西就画个图就可以了。把关注点放在例子上,设计模式还是要使用中才有感受。
从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的更多相关文章
- simple factory, factory method, abstract factory
simple factory good:1 devide implementation and initialization2 use config file can make system more ...
- 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明
Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...
- 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 ...
- 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 ...
- 设计模式之美:Abstract Factory(抽象工厂)
索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...
- 大话设计模式--工厂方法模式 Factory Method -- C++实现
1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- Design Pattern ->Factory Method
Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...
随机推荐
- 尝试跑一跑Scut
前段时间都在用 IIS+WCF+Redis+MSSQL 的框架做服务器,前段时间看到了 Scut 的开源框架,整个架构还是蛮干净整洁的... 今天抓来跑一跑. 按照教程安装好所有的环境,版本是6.7. ...
- android Base64加密解密
// 加密传入的数据是byte类型的,并非使用decode方法将原始数据转二进制,String类型的数据 使用 str.getBytes()即可 String str = "Hello!&q ...
- 【转】Android开发学习笔记:EditText的属性介绍
原文网址:http://liangruijun.blog.51cto.com/3061169/627350 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- //string scriptstrs = "<script>alert('欢迎光临!');</script>";
//string scriptstrs = "<script>alert('欢迎光临!');</script>"; //if (!Page.ClientSc ...
- CSU 1559 订外卖
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82842#problem/E 订外卖 解题思路:定义两个数组,a[]表示满A,b ...
- Java程序员需要注意的五大Docker误区
Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Dock ...
- 《BackboneJS框架的技巧及模式》(2)
<BackboneJS框架的技巧及模式>(2) 本文紧接第一部分:<BackboneJS框架的技巧及模式(1)> 作者:chszs,转载需注明.博客主页:http://blog ...
- 定时执行程序-Quartz简单实例
1.加jar包:Quartz自己quartz-1.8.3.jar和依赖包commons-logging.jar .slf4j-log4j12-1.5.10.jar .slf4j-api-1.5.10 ...
- 解决display: inline-block; 4px间隙的全兼容做法
就拿ul, li标签做例,关键代码如下: ul{ font-size: 0; letter-spacing: -4px; word-spacing: -4px; //解决4px间隙的全兼容做法 } l ...
- View inflate方法和LayoutInflater inflate方法的区别详解
原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/6257510.html 我们在Android开发中,对于将布局填充成View对象,最常用的两种办法 ...