java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处: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设计模式 -------- 创建模式 之 抽象工厂模式的更多相关文章
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- Java设计模式:Abstract Factory(抽象工厂)模式
概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品) ...
- Java设计模式(二)抽象工厂模式
一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
随机推荐
- 转 select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...
- 【数论】【枚举约数】【友好数】CODEVS 2632 非常好友
O(sqrt(n))枚举约数,根据定义暴力判断友好数. #include<cstdio> #include<cmath> using namespace std; int n; ...
- 【树套树】bzoj3110 [Zjoi2013]K大数查询
题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...
- 【贪心】bzoj3709 [PA2014]Bohater
把怪分成两类看: 一.回血>损血 则若先杀损血少的再杀损血多的,则为当前这一步提供了更高的可能性.因为血量是单增的,所以尽量用较少的血量去干♂耗血较少的怪物. 二.回血<损血 则若先杀回血 ...
- [CF930E]/[CF944G]Coins Exhibition
[CF930E]/[CF944G]Coins Exhibition 题目地址: CF930E/CF944G 博客地址: [CF930E]/[CF944G]Coins Exhibition - skyl ...
- 通过映射缓存文件夹加速WPF的响应速度
到了Visual Studio 2012时,WPF的设计器已经非常好用了,大多数的时候基本上可以抛弃Blend了.但是,仍然存在一些不令人满意的问题,那就是当项目非常大的时候,很多时候页面切换变得比较 ...
- jquery获取css颜色值返回RGB应用
我来给大家介绍一下在jquery获取css颜色值返回RGB方法,希望此文章对各位同学会有所帮助哦. 代码如下: 代码如下 复制代码 a, a:link, a:visited { color:#4 ...
- javascript 常用手势 分析
javascript 常用手势, 个人觉得有3个 tap,swipe(swipeLeft,swipeRight,swipeTop,swipeRight),hold tap 是轻击 判断的原则是,在to ...
- Debian、Ubuntu 源列表说明
转载:http://forum.ubuntu.org.cn/viewtopic.php?t=366506 概貌: 源列表主文件为 /etc/apt/sources.list,另兼取 /etc/apt/ ...
- 我们知道写入过程比ZooKeeper集合中的读取过程要贵,因为所有节点都需要在数据库中写入相同的数据。因此,对于平衡的环境拥有较少数量(例如3,5,7)的节点比拥有大量的节点要好。
我们知道写入过程比ZooKeeper集合中的读取过程要贵,因为所有节点都需要在数据库中写入相同的数据.因此,对于平衡的环境拥有较少数量(例如3,5,7)的节点比拥有大量的节点要好. 组件 描述 写入( ...