工厂模式,简单工厂模式,java抽象工厂模式式 三者有什么区别

  之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略。这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数据库等)利用好工厂模式对程序的设计很有用处。工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。下面结合例子分析三者的区别。
  首先是简单工厂模式,这里以工厂生产产品为例。
产品类的共同接口
* @author CIACs
7 public interface Product {
//声明类所需继承的共同接口,也可以是抽象类
* @author CIACs
7 public class ProductA implements Product {
public ProductA() {
System.out.println("ProductA");
* @author CIACs
7 public class ProductB implements Product {
public ProductB() {
System.out.println("ProductB");
* @author CIACs
7 public class Factory {
//可以在工厂类中添加任何你所需要的逻辑
public static Product create(String str)
//生成ProductA
if(str.equalsIgnoreCase("ProductA"))
return new ProductA();
//生成ProductB
if(str.equalsIgnoreCase("ProductB"))
return new ProductB();
return null;
* @author CIACs
7 public class Client {
public static void main(String[] args) {
//调用Factory的静态方法生成所要的类
Factory.create("productA");
Factory.create("ProductB");
控制台输出结果:
  简单工厂模式实现了生成产品类的代码跟客户端代码分离,在工厂类中你可以添加所需的生成产品的逻辑代码,但是问题来了,优秀的java代码是符合&开放-封闭&原则的,也就是说对扩展开发,对修改关闭,如果你要加一个产品类C,你就要修改工厂类里面的生成产品的代码,在这里你就要增加if-else判断。对于这个问题,我们的工厂方法模式就可以解决这个问题。
  接下来是工厂方法模式
&产品类中增加了ProductC(其他产品类的代码是可以重用上面的,只要把包名更改了就行)。
1 package factoryM
* @author CIACs
8 public class ProductC implements Product {
public ProductC() {
System.out.println("productC");
声明工厂接口
1 package factoryM
* @author CIACs
7 public interface Factory {
//声明产生产品类的方法
public Product createProduct();
产生ProductA的FactoryA
1 package factoryM
* @author CIACs
7 public class FactoryA implements Factory {
//实现工厂类的方法生成产品类A
public Product createProduct()
return new ProductA();
产生ProductB的FactoryB
1 package factoryM
* @author CIACs
7 public class FactoryB implements Factory {
//实现工厂类的方法生成产品类B
public Product createProduct()
return new ProductB();
产生ProductC的FactoryC
1 package factoryM
* @author CIACs
7 public class FactoryC implements Factory {
//实现工厂类的方法生成产品类C
public Product createProduct()
return new ProductC();
1 package factoryM
* @author CIACs
7 public class Client {
public static void main(String[] args) {
factory = new FactoryA();
factory.createProduct();
factory = new FactoryB();
factory.createProduct();
factory = new FactoryC();
factory.createProduct();
控制台输出结果:
&  工厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现&开发-封闭&原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。假如我们要实现的产品接口不止一个,也就是有多个产品接口,不同产品接口有对应的产品族。什么是产品族呢?简单的理解就是,不同牌子产的车里面会有跑车类型,家庭类型,商用类型等的车,不同牌子的车的跑车类型的车可以组成一个产品族。对于这种情况我们可以采用抽象工厂模式。
   最后是抽象工厂模式,在这里我们为不同产品附加上对应的礼物,就是说ProductA中会有GiftA。
增加的Gift接口
1 package abstractF
* @author CIACs
7 public interface Gift {
//声明产品赠品的接口,当然也可以是抽象类,同样为了简单就不声明方法了
1 package abstractF
* @author CIACs
7 public class GiftA implements Gift {
public GiftA()
System.out.println("GiftA");
1 package abstractF
* @author CIACs
7 public class GiftB implements Gift {
public GiftB()
System.out.println("GiftB");
Factory接口
1 package abstractF
* @author CIACs
*声明Product类工厂和Gift类工厂的工同工厂接口
7 public interface Factory {
public Product createProduct();
public Gift createGift();
生成ProductA和GiftA的FactoryA
1 package abstractF
* @author CIACs
*FactoryA可以生成ProductA和GiftA
7 public class FactoryA implements Factory {
public Product createProduct()
return new ProductA();
public Gift createGift()
return new GiftA();
生成ProductB和GiftB的FactoryB
1 package abstractF
* @author CIACs
*FactoryB可以生成ProductB和GiftB
7 public class FactoryB implements Factory {
public Product createProduct() {
return new ProductB();
public Gift createGift() {
return new GiftB();
1 package abstractF
* @author CIACs
7 public class Client {
public static void main(String[] args) {
factory = new FactoryA();
factory.createProduct();
factory.createGift();
factory = new FactoryB();
factory.createProduct();
factory.createGift();
控制台输出结果:
  抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了&开放-封闭&原则,是三个模式中较为抽象,并具一般性的模式。我们在使用中要注意使用抽象工厂模式的条件。
阅读(...) 评论()为了账号安全,请及时绑定邮箱和手机
适配器模式和抽象工厂模式的区别吗?
老师可以讲一下适配器模式和抽象工厂模式的区别吗?或者是实例也行
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&简单工厂模式、工厂模式、抽象工厂模式和反射工厂模式之间的区别
简单工厂模式,定义一个产品接口,可以实现多个产品,定义一个具体工厂,所有产品通过工厂接收的参数来实例化。适用范围,可以用在产品固定,不需要对产品进行扩展,比如,实现数据库的连接,可以通过简单工厂模式来实现,因为数据库的类型基本是固定的那几个,将数据库类型作为产品,不需要太好的扩展。
<img TITLE="(转)设计模式学习笔记三:简单工厂(Simple&&wbr&Factory)" BORDER="0" ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="/cnblogs_com/peida/Operation.GIF" WIDTH="493" HEIGHT="217" ACTION-TYPE="show-slide" ACTION-DATA="/cnblogs_com/peida/Operation.GIF" />
简单工厂模式的类图
&&&&工厂模式,产品作为一个接口,工厂也作为一个接口,每个子产品又对应一个子工厂,子产品的实例化由对应的子工厂来实现,符合开闭原则,易扩展,需要添加一个新产品时,只要实现一个新产品的子类,同时实现一个对应的生产新产品的子工厂即可,不需要对原有产品进行修改。
缺点是在客户类里调用时需要修改,比如一个物流公司,其最初成立时使用面包车来运输其货物,但是,随着其业务的不断发展壮大,面包车已经不足以装载需要运输的货物,这时候就需要新购进货车,为了用新买的货车替换正在使用的面包车,物流公司不得不全国各地的跑,将全国各地所有在用的面包车淘汰掉,用新买的货车来替代,工作量很大,而且替换的数量一多,可能有些地方没有考虑到,等以后某件大型货物运输到这个点时,就会因为面包车运输不了而出问题。
&<img TITLE="(转)设计模式学习笔记四:工厂方法(Factory&&wbr&Method)" BORDER="0" ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="/cnblogs_com/peida/OperationFactory1.GIF" WIDTH="632" HEIGHT="352" ACTION-TYPE="show-slide" ACTION-DATA="/cnblogs_com/peida/OperationFactory1.GIF" />
可以看出来,工厂模式的工厂,实例化的对象只有一个,如果实例化的对象是多个,就成了抽象工厂模式,其实工厂模式和抽象工厂也就这点区别
先来看看抽象工厂的UML图
优点:应用场景:封装变化点。创建一系列相互依赖的对象。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点:与工厂模式一样
&&&&反射工厂:用于解决工厂模式和抽象工厂模式的缺点,定义一个产品接口和一个工厂接口,然后定义一对子产品实现,而工厂只需要实现一个反射工厂,其接受一个类型名字符串作为参数,反射工厂根据传入的参数使用反射技术来动态生成传入类型的实例。
客户端需要创建一个产品时,只需要将该产品的类型作为参数传给反射工厂,反射工厂就会动态生成子产品的实例。即使需要增加一种新的子产品,也不需要增加新的子工厂。只要将子产品的类型名写到配置文件中,从配置文件读取子产品的类型名,则完全不需要对工程进行修改,只要重新生成子产品的类包即可。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 简单工厂与抽象工厂 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信