`
tianmo2008
  • 浏览: 67692 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计模式之--工厂模式(Factory)

阅读更多
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。
工厂模式的形态
工厂模式主要用一下几种形态:
1:简单工厂(Simple Factory)。
2:工厂方法(Factory Method)。
3:抽象工厂(Abstract Factory)。

简单工厂(Simple Factory)
又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:
假设一家工厂,几生产洗衣机,有生产冰箱,还有空调等等..
我们先为所有产品定义一个共同的产品接口
public interface Product{}

接着我们让这个工厂的所有产品都必须实现此接口
public class Washer implements Product{
   public Washer(){
       System.out.println("洗衣机被制造了");
   }
}

public class Icebox implements Product{
   public Icebox(){
       System.out.println("冰箱被制造了");
   }
}

public class AirCondition implements Product{
   public Icebox(){
       System.out.println("空调被制造了");
   }
}

接下来我们来写一个工厂类,有它来负责生产以上的产品
public class SimpleFactory {
	
	public static Product factory(String productName) throws Exception{
		if(productName.equals("Washer")){
			return new Washer();
		}else if(productName.equals("Icebox")){
			return new Icebox();
		}else if(productName.equals("AirCondition")){
			return new AirCondition();
		}else{
			throw new Exception("没有该产品");
		}
	}
}

好了,有了这个工厂类,我们就可以开始下定单了,SimpleFactory将根据不同的定单类决定生产什么产品。
public static void main(String[] args) {
	try {
              SimpleFactory.factory("Washer");
              SimpleFactory.factory("Icebox");
              SimpleFactory.factory("AirCondition");
            } catch (Exception e) {
		e.printStackTrace();
	}
}

由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。
但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...
还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....
以上的不足将在工厂模式的另外两种状态中得到解决。

工厂方法(Factory Method)
上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:
public interface Factory{
  public Product create();
}

我们再来定义一个产品接口
public interface Product{}

一下是实现了产品接口的产品类
public class Washer implements Product{
   public Washer(){
       System.out.println("洗衣机被制造了");
   }
}

public class Icebox implements Product{
   public Icebox(){
       System.out.println("冰箱被制造了");
   }
}

public class AirCondition implements Product{
   public Icebox(){
       System.out.println("空调被制造了");
   }
}

接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类,
//创建洗衣机的工厂
public class CreateWasher implements Factory{
    public Product create(){
          return new Washer();
    }
}

//创建冰箱的工厂
public class CreateIcebox implements Factory{
    public Product create(){
          return new Icebox();
    }
}

//创建空调的工厂
public class CreateAirCondition implements Factory{
    public Product create(){
          return new AirCondition();
    }
}

从上面创建产品对象的代码可以看出,工厂方法简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

抽象工厂(Factory Method)
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。<<Java设计模式>>
我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,
我们继续用上面的例子来说明:
工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

冰箱:

      
  1. 冰箱-A
  2.   
  3. 冰箱-B


洗衣机:

      
  1. 洗衣机-A
  2.   
  3. 洗衣机-B

我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类,
//洗衣机接口
public interface Washer{
}

//冰箱接口
public interface Icebox{
}

接着,我们分别创建这两个接口的具体产品
//洗衣机-A
public class WasherA implements Washer{
   public WasherA(){
       System.out.println("洗衣机-A被制造了");
   }
}

//洗衣机-B
public class WasherB implements Washer{
   public WasherB(){
       System.out.println("洗衣机-B被制造了");
   }
}

//冰箱-A
public class IceboxA implements Icebox{
   public IceboxA(){
       System.out.println("冰箱-A被制造了");
   }
}

//冰箱-B
public class IceboxB implements Icebox{
   public IceboxB(){
       System.out.println("冰箱-B被制造了");
   }
}

到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口
public interface Factory{
       public Washer createWasher();
       public Icebox createIcebox();
}

接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类
//创建型号为A的产品工厂
public class FactoryA implements Factory{
       //创建洗衣机-A
       public Washer createWasher(){
            return new WasherA();
       }

       //创建冰箱-A
       public Icebox createIcebox(){
            return new IceboxA();
       }
}

//创建型号为B的产品工厂
public class FactoryB implements Factory{
       //创建洗衣机-B
       public Washer createWasher(){
            return new WasherB();
       }

       //创建冰箱-B
       public Icebox createIcebox(){
            return new IceboxB();
       }
}

这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.
分享到:
评论
5 楼 andylj511 2008-11-13  
//洗衣机-A  
public class WasherA implements Washer{  
   public Washer(){  
       System.out.println("洗衣机-A被制造了");  
   }  
}  
 
//洗衣机-B  
public class WasherB implements Washer{  
   public Washer(){  
       System.out.println("洗衣机-B被制造了");  
   }  


你这里每个类实现他们的接口,然后写自己的构造器..好像错了啊
4 楼 tianmo2008 2008-11-13  
sea7 写道

tianmo2008 写道sea7 写道
很纳闷,你真的了解它们三者的区别吗?

呵呵,现在还在学,没有实际的用过,所以一些理解没那么深刻。有什么建议或觉得我的笔记做的有不对或不足的,请指点一下哦,谢谢了。
抽象工厂和工厂方法的区别在于它们的意图不同而不是工厂方法是创建一个产品,而抽象工厂是创建很多产品。

抽象工厂只是创建一系列相互依赖或关联地产品的借口,是针对类的设计模式。

工厂方法是定一个一个接口,让子类去实例化,是针对对象的设计模式。

呵呵,我对工厂方法的理解确实觉得很纳闷,给你这样一说,觉得有点思路了,谢谢了。
3 楼 sea7 2008-11-12  
tianmo2008 写道
sea7 写道

很纳闷,你真的了解它们三者的区别吗?

呵呵,现在还在学,没有实际的用过,所以一些理解没那么深刻。有什么建议或觉得我的笔记做的有不对或不足的,请指点一下哦,谢谢了。

抽象工厂和工厂方法的区别在于它们的意图不同而不是工厂方法是创建一个产品,而抽象工厂是创建很多产品。

抽象工厂只是创建一系列相互依赖或关联地产品的借口,是针对类的设计模式。

工厂方法是定一个一个接口,让子类去实例化,是针对对象的设计模式。



2 楼 tianmo2008 2008-11-12  
sea7 写道

很纳闷,你真的了解它们三者的区别吗?

呵呵,现在还在学,没有实际的用过,所以一些理解没那么深刻。有什么建议或觉得我的笔记做的有不对或不足的,请指点一下哦,谢谢了。
1 楼 sea7 2008-11-12  
很纳闷,你真的了解它们三者的区别吗?

相关推荐

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。 - 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示...

    设计模式之-工厂方法-FactoryMethod

    《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...

    设计模式之-抽象工厂-AbstractFactory

    抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...

    设计模式----工厂模式

    工厂模式是面向对象设计中最为人熟知的设计模式之一,属于创建型模式,其主要目标是封装对象的创建过程,使得客户端无需关心对象的具体创建细节,只需通过工厂接口来获取所需的对象。 ### 1. 工厂模式的基本概念 ...

    C++设计模式--基于Qt4开源跨平台开发框架

    创建型模式如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory),主要关注对象的创建过程,旨在减少类之间的耦合度。结构型模式如适配器模式(Adapter)、装饰器模式...

    设计模式----简单工厂模式

    简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,使得代码在创建对象时更加灵活,同时也隐藏了对象的创建细节。在这个模式中,一个专门的工厂类负责创建特定类型的对象,而...

    创建型设计模式----抽象工厂模式

    抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...

    设计模式----抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定具体的类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需了解它们的具体实现。在Java或其他面向...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象编程中最核心的设计原则之一。这些模式可以帮助开发者解决常见的编程问题,并提高代码的可复用性和可维护性。 #### 创建型模式 创建型模式关注的是对象...

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

    Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel

    Java设计模式 - 简单工厂 & 工厂方法(构建工厂)源码:FactoryModel - 详情:https://blog.csdn.net/Dream_Weave/article/details/83989879

    设计模式精解-GoF23种设计模式解析附C++实现源码

    - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的...

    设计模式之Factory

    本篇文章将详细探讨"设计模式之Factory",它是一种非常基础且重要的创建型设计模式。 Factory模式的核心思想是提供一个接口或者抽象类,用于创建某一类对象,但允许其子类决定实例化哪一个类。这种模式使得创建过程...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的核心内容之一。本文旨在深入解析这些设计模式,并通过C++实现来帮助读者更好地理解和应用这些模式。 #### 1. 创建型模式 创建型模式关注的是对象的...

    设计模式专题之(二)工厂方法模式---设计模式工厂方法模式示例代码(python--c++)

    本篇文章将深入探讨设计模式中的一个核心概念——工厂方法模式,通过Python和C++的示例代码来阐述其原理和应用。 工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。...

Global site tag (gtag.js) - Google Analytics