- 浏览: 328144 次
- 性别:
- 来自: 广州
文章分类
最新评论
一:什么是抽象工厂模式
抽象工厂是工厂模式中最为抽象和最具一般性的一种形态,它是面对多个产品等级结构的系统设计.假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式,这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品.抽象工厂模式涉及到以下的角色:
A:抽象工厂(AbstractFactory)角色:这个角色是工厂方法模式的核心,它是与应用系统的商业逻辑无关的,通常使用Java接口或者抽象类实现,而所有的具体工厂必须实现这个Java接口或继承这个抽象类.
B:具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的,通常使用具体类实现这个角色.
C:抽象产品(Abstract Product)角色:这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口,通常用接口或抽象类实现这个角色.
D:具体产品(Concrete Porduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例,这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑,通常使用具体类实现这个角色.
在上面的例子中有两个产品等级结构,而每个产品等级结构中又有两个产品,也就是有两个产品族,因此工厂等级结构中就会出现两个具体工厂(对应于两个产品族),而每个工厂类中又有两个工厂方法(对应于两个产品等级结构)
二:我们还是来看农场系统的例子:
假设农场系统中有两个等级结构:Fruit(水果)和Veggie(蔬菜),以及两个产品族:Tropical和Northern,于是便有四种产品,分别是TropicalFruit(热带水果),TropicalVeggie(热带蔬菜) ,NorthernFruit(北方水果)以及NorthernVeggie(北方蔬菜)
首先定义一个Gardener接口:
NorthernGardener和TropicalGardener都是抽象工厂类Garderer的具体子类,也就是说它们全都是具体工厂类,源代码如下:
在使用时,客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法,就可以得到所需要的产品对象。
三:此模式对"开-闭"原则的支持
"开-闭"原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强其功能的目的,对于一个涉及到多个产品等级结构和多个产品族的系统,其功能的增强不外乎两个方面:
A:增加新的产品族
B:增加新的产品等级结构
四:相关的模式与模式的实现
具体工厂类可以设计成单例类,如农场系统中的NorthernGardener和TropicalGardener只要一个实例就可以了。
抽象工厂是工厂模式中最为抽象和最具一般性的一种形态,它是面对多个产品等级结构的系统设计.假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式,这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品.抽象工厂模式涉及到以下的角色:
A:抽象工厂(AbstractFactory)角色:这个角色是工厂方法模式的核心,它是与应用系统的商业逻辑无关的,通常使用Java接口或者抽象类实现,而所有的具体工厂必须实现这个Java接口或继承这个抽象类.
B:具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的,通常使用具体类实现这个角色.
C:抽象产品(Abstract Product)角色:这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口,通常用接口或抽象类实现这个角色.
D:具体产品(Concrete Porduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例,这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑,通常使用具体类实现这个角色.
源代码: package cai.milenfan.basic.test; //抽象工厂角色 public interface Creator { //产品等级结构A的工厂方法 public ProductA factoryA(); //产品等级结构B的工厂方法 public ProductB factoryB(); }
package cai.milenfan.basic.test; public class ConcreteCreator1 implements Creator{ public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); } }
package cai.milenfan.basic.test; public class ConcreteCreator2 implements Creator{ public ProductA factoryA() { return new ProductA1(); } public ProductB factoryB() { return new ProductB1(); } }
package cai.milenfan.basic.test; public interface ProductA { }
package cai.milenfan.basic.test; public class ProductA1 implements ProductA{ }
package cai.milenfan.basic.test; public class ProductA2 implements ProductA{ }
package cai.milenfan.basic.test; public interface ProductB { }
package cai.milenfan.basic.test; public class ProductB1 implements ProductB{ }
package cai.milenfan.basic.test; public class ProductB2 implements ProductB{ }
在上面的例子中有两个产品等级结构,而每个产品等级结构中又有两个产品,也就是有两个产品族,因此工厂等级结构中就会出现两个具体工厂(对应于两个产品族),而每个工厂类中又有两个工厂方法(对应于两个产品等级结构)
二:我们还是来看农场系统的例子:
假设农场系统中有两个等级结构:Fruit(水果)和Veggie(蔬菜),以及两个产品族:Tropical和Northern,于是便有四种产品,分别是TropicalFruit(热带水果),TropicalVeggie(热带蔬菜) ,NorthernFruit(北方水果)以及NorthernVeggie(北方蔬菜)
首先定义一个Gardener接口:
package cai.milenfan.basic.test; public interface Gardener { }
NorthernGardener和TropicalGardener都是抽象工厂类Garderer的具体子类,也就是说它们全都是具体工厂类,源代码如下:
package cai.milenfan.basic.test; public class NorthernGardener implements Gardener{ //水果的工厂方法 public Fruit createFruit(String name){ return new NorthernFruit(name); } //蔬菜的工厂方法 public Viggie createViggie(String name){ return new NorthernViggie(); } }
package cai.milenfan.basic.test; public class TropicalGardener { //水果的工厂方法 public Fruit createFruit(String name){ return new TropicalFruit(name); } //蔬菜的工厂方法 public Viggie createViggie(String name){ return new TropicalViggie(); } }
package cai.milenfan.basic.test; public interface Viggie { }
package cai.milenfan.basic.test; public class NorthernViggie implements Viggie{ private String name=""; public NorthernViggie(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cai.milenfan.basic.test; public class TropicalViggie implements Viggie{ private String name=""; public TropicalViggie(){} public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cai.milenfan.basic.test; public interface Fruit { } package cai.milenfan.basic.test; public class NorthernFruit implements Fruit{ private String name=""; public NorthernFruit(String name){} public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cai.milenfan.basic.test; public class TropicalFruit implements Fruit{ private String name=""; public TropicalFruit(String name){} public String getName() { return name; } public void setName(String name) { this.name = name; } }
在使用时,客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法,就可以得到所需要的产品对象。
三:此模式对"开-闭"原则的支持
"开-闭"原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强其功能的目的,对于一个涉及到多个产品等级结构和多个产品族的系统,其功能的增强不外乎两个方面:
A:增加新的产品族
B:增加新的产品等级结构
四:相关的模式与模式的实现
具体工厂类可以设计成单例类,如农场系统中的NorthernGardener和TropicalGardener只要一个实例就可以了。
发表评论
-
Mina重连
2014-05-26 21:29 2865import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6081.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 539一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 736安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1142使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 414ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1091http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 873不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 805http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 464http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 947http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 638http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 571http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 782http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 898http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 387http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 490http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 811当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 984目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
Android之大话设计模式——:抽象工厂模式借鉴.pdf
Android之大话设计模式——:抽象工厂模式参考.pdf
Android之大话设计模式:抽象工厂模式终稿.pdf
java中常用的设计模式,能更好的整合代码,多的不说....
NULL 博文链接:https://364232252.iteye.com/blog/2371357
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理...
设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 设计模式 抽象工厂模式 三层架构 要您一个资源分,也算是对我的尊重,谢谢下载。
C#设计模式:抽象工厂实例解析.7zC#设计模式:抽象工厂实例解析.7z
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
抽象工厂模式ppt。抽象工厂模式ppt。抽象工厂模式ppt。
设计模式-抽象工厂模式(讲解及其实现代码)
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂(加类图)
基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等 Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式...
设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...
1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式
设计模式,AbstractFactory,抽象工厂模式
java设计模式【之】抽象工厂模式【源码】【场景:制作咖啡】 * 抽象工厂 * * 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。 * 在工厂方法的基础上,进一步抽象工厂...