本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

工厂方法模式和抽象工厂模式不好区分清楚:

工厂方法模式特点:

1. 一个抽象产品类,能够派生出多个详细产品类。
2. 一个抽象工厂类,能够派生出多个详细工厂类。
3. 每一个详细工厂类仅仅能创建一个详细产品类的实例。

抽象工厂模式特点:

1. 多个抽象产品类,每一个抽象产品类能够派生出多个详细产品类。
2. 一个抽象工厂类。能够派生出多个详细工厂类。   
3. 每一个详细工厂类能够创建多个详细产品类的实例。也就是创建的是一个产品线下的多个产品。

两者的差别:

1. 工厂方法模式仅仅有一个抽象产品类,而抽象工厂模式有多个。
2. 工厂方法模式的详细工厂类仅仅能创建一个详细产品类的实例。而抽象工厂模式能够创建多个。
3. 工厂方法创建 "一种" 产品,他的着重点在于"怎么创建"。也就是说假设你开发。你的大量代码非常可能环绕着这样的产品的构造,初始化这些细节上面。也由于如此。相似的产品之间有非常多能够复用的特征。所以会和模版方法相随。抽象工厂须要创建一些列产品,着重点在于"创建哪些"产品上,也就是说。假设你开发,你的主要任务是划分不同差异的产品线,而且尽量保持每条产品线接口一致,从而能够从同一个抽象工厂继承。

还是以上面的样例,即四则运算来说明,如果这样一种情况,如今不光是要实现两个double型的数的加减法,还要实现两个整数之间的加减法,也就是要在原来的基础上添加两个整型数的相加减。

每个模式都是针对一定问题的解决方式。

抽象工厂模式与工厂方法模式的最大差别就在于,工厂方法模式针对的是一个产品等级结构。而抽象工厂模式则须要面对多个产品等级结构。

  在学习抽象工厂详细实例之前,应该明确两个重要的概念:产品族和产品等级。

   所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。

如。能够将加法中的两个整型数相加,两个double型数进行相加,就构成一个产品族。

理解了这些后。那么怎样用抽象工厂方法来实现两个整数的相加减和两个double型的数相加减呢。先看UML类图:

有了UML类图,非常自然的,就能够写出各个类和接口,详细例如以下:

抽象工厂模式应用步骤:

1. 分别创建int型和double型的操作接口

public interface IntOperation {
public int Operate(int a,int b);
}
public interface DoubleOperation {
public double Operate(double a,double b);
}

2. 分别创建两种类型的加减法的实现类

public class IntAddOperation implements IntOperation {

	@Override
public int Operate(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}
}
public class IntSubOperation implements IntOperation {
@Override
public int Operate(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
public class DoubleAddOperation implements DoubleOperation {

	@Override
public double Operate(double a, double b) {
// TODO Auto-generated method stub
return a+b;
}
}
public class DoubleSubOperator implements DoubleOperation {

	@Override
public double Operate(double a, double b) {
// TODO Auto-generated method stub
return a-b;
}
}

3. 创建抽象工厂接口

public interface OperationFactory {
public IntOperation createIntOperation();
public DoubleOperation createDoubleOperation();
}

4. 创建加法和减法的工厂实现类

public class AddOperationFactory implements OperationFactory {

	@Override
public IntOperation createIntOperation() {
// TODO Auto-generated method stub
return new IntAddOperation();
} @Override
public DoubleOperation createDoubleOperation() {
// TODO Auto-generated method stub
return new DoubleAddOperation();
}
}
public class SubOperationFactory implements OperationFactory {

	@Override
public IntOperation createIntOperation() {
// TODO Auto-generated method stub
return new IntSubOperation();
} @Override
public DoubleOperation createDoubleOperation() {
// TODO Auto-generated method stub
return new DoubleSubOperator();
}
}

5. 创建測试类

public class OperationTest {

	/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//加法工厂负责生产两个整型数的相加和两个double型的数相加
OperationFactory of1 = new SubOperationFactory();
IntOperation IntAdd = of1.createIntOperation();
DoubleOperation DoubleAdd = of1.createDoubleOperation();
System.out.println("10+25="+IntAdd.Operate(10, 25));
System.out.println("10.2+25.3="+DoubleAdd.Operate(10.2, 25.3)); //减法工厂负责生产两个整数的相减,以及两个double型数的相减
OperationFactory of2 = new AddOperationFactory();
IntOperation IntSub = of2.createIntOperation();
DoubleOperation DoubleSub = of2.createDoubleOperation();
System.out.println("10-25="+IntSub.Operate(10, 25));
System.out.println("10.2-25.3="+DoubleSub.Operate(10.2, 25.3));
}
}

运行结果:

10+25=-15
10.2+25.3=-15.100000000000001
10-25=35
10.2-25.3=35.5

这个样例总感觉不太恰当,眼下我也在学习阶段。不是非常懂。随着学习设计模式的深入,等理解了再次来思考下这个抽象工厂模式,看到该帖的各位,假设有更好的解释。也请给我大概说下,共同学习嘛

java设计模式 -------- 创建模式 之 抽象工厂模式的更多相关文章

  1. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  2. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  3. Java设计模式:Abstract Factory(抽象工厂)模式

    概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...

  4. Java设计模式(二)抽象工厂模式

    一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...

  5. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  6. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

  7. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  8. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  9. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

随机推荐

  1. php调用html添加超链接的方法

    不知道为何老搜不到,使用require_once命令导入的HTML文件没法加载js脚本,于是只能另谋他路,终于实线了,代码为 <?php header("Content-type:te ...

  2. [BZOJ4337][BJOI2015]树的同构(树的最小表示法)

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1023  Solved: 436[Submit][Status ...

  3. [xsy1140]求值

    $\newcommand{ali}[1]{\begin{align*}#1\end{align*}}$题意:给定$n,b,c,d,e,a_{0\cdots n-1}$,令$x_k=bc^{4k}+dc ...

  4. [ZOJ3316]Game

    题意:有一个棋盘,棋盘上有一些棋子,两个人轮流拿棋,第一个人可以随意拿,以后每一个人拿走的棋子与上一个人拿走的棋子的曼哈顿距离不得超过$L$,无法拿棋的人输,问后手能否胜利 把棋子看做点,如果两个棋子 ...

  5. 【贪心】【线性基】bzoj2460 [BeiJing2011]元素 / bzoj3105 [cqoi2013]新Nim游戏

    p2460: #include<cstdio> #include<algorithm> using namespace std; #define N 1001 typedef ...

  6. python3开发进阶-Django框架的起飞加速一(ORM)

    阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...

  7. [转]从此爱上iOS Autolayout

    原文地址 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程.这篇文章两个月前就想写下来,但 ...

  8. Linux下使用xargs得到字符串作为参数进行输出、awk得到字符串作为参数进行输出

    背景: cat test.txt 实例: 1.xargs cat test.txt | xargs -i echo {} cat test.txt | xargs -I {} echo {} 大小写i ...

  9. 谁说 JavaScript 很简单了?

    转载请注明出处,保留原文链接以及作者信息 本文介绍了 JavaScript 初学者应该知道的一些技巧和陷阱.如果你是老司机,就当做回顾了,哪里有写的不好的地方欢迎指出. 1. 你是否尝试过对一个数字数 ...

  10. VMware虚拟机中为Linux 添加虚拟硬盘(VirtualBox方法类似)

    修改1:2014-06-24 11:38:21 Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法,因为大多数初学者习惯使用虚拟机,这里以在Vmware虚拟机中实现 ...