本文是自己学习所做笔记,欢迎转载,但请注明出处: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. [Codeforces 8D] Two Friends

    Brief Introduction: 有两人a.b,他们都在A点,a经过B点到C点,而b直接到C点.a走过的距离不超过la,b走过距离不超过lb,询问他们可能经过最长的公共距离. Algorithm ...

  2. POJ 2226 Muddy Fields (二分图匹配)

    [题目链接] http://poj.org/problem?id=2226 [题目大意] 给出一张图,上面有泥和草地,有泥的地方需要用1*k的木板覆盖, 有草地的地方不希望被覆盖,问在此条件下需要的最 ...

  3. 【线性基】【贪心】【独立环】bzoj2115 [Wc2011] Xor

    网上到处都是题解,自己画个图也很好理解.虽然环的个数很多,但是都可以通过独立环之间异或出来,不用管. 独立环求法:生成树之后,每次向图里添加非树边(u,v),则这个独立环的异或和为sum[u]^sum ...

  4. [Android]Android 布局中如何让图片和文字居中显示?

    图片文字居中显示 **①组件TextView的属性 drawableTop ``` <LinearLayout android:layout_width="match_parent&q ...

  5. 原始DAO开发

    1,pojo package com.songyan.dao; import com.songyan.pojo.Student; public interface StudentDao { publi ...

  6. Shiro+SpringMVC 实现更安全的登录(加密匹配&登录失败超次数锁定帐号)

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/48518003 前言 初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍 ...

  7. Coherence的NameService

    Coherence*Extend模式下客户端需要连接一个或多个proxy Server从而接入集群,在一些比较大型的环境中,Proxy Server往往比较多,一旦修改起来需要修改每个配置文件,在Co ...

  8. nullptr 与 constexpr

    nullptr   nullptr出现的目的自然是替换NULL的低位.C++可能会将NULL.0视为同一种东西.这取决于编译器是如何定义的,有的编译器定义NULL为 ( (void * )0) ,有的 ...

  9. linux/mac系统的软链接文件与硬链接文件

    1.硬连接只能使用在文件上,不可以使用在文件夹上.至于文件前面的硬链接数字的含义如下: 如图标注区,为硬连接的数量,文件前的数字1表示没有硬链接.文件夹前面的数字至少是2,含义是这个文件夹是空文件夹, ...

  10. linux 输出重定向 何时会写文件

    linux 输出重定向 何时会写文件 测试到了8K才会进行flush: