java 设计模式之 工厂模式

来源:互联网 发布:医院机关哪好 知乎 编辑:程序博客网 时间:2024/06/08 15:52

        工厂模式主要是为创建对象提供过渡接口,将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的,便于程序更好的扩展和维护

一。使用 工厂模式的两种情况:

1.1. 在编码时不能预见需要创建哪种类的实例。

1.2. 系统不应依赖于产品类实例如何被创建、组合和表达的细节

二。工厂模式 的 分类

 2.1. 简单工厂模式(Simple Factory) :不利于产生系列产品;
 2.2. 工厂方法模式(Factory Method) :又称为多形性工厂;
 2.3. 抽象工厂模式(Abstract Factory) :又称为工具箱,产生产品族,但不利于产生新的产品;

 这三种模式从上到下逐步抽象,并且更具一般性。

#  GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式 与抽象工厂模式。即 将 简单工厂模式 看为 工厂方法模式 的一种特例,两者归为一类。

三。简单工厂 模式

       简单工厂模式又称静态工厂方法模式。它存在的目的很简单:定义一个用于创建对象的接口。
3.1. 简单工厂模式的组成: 
        工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来  创建产品,在java中它往往由一个 具体类 实现。
        抽象产品角色:它一般是具体产品继承的  父类  或者实现的  接口。         
        具体产品类角色:工厂类所创建的对象就是此角色的实例,
在java中由一个具体类实现。

 3.2. 案例

     

 后台输出   Driving BMW

四。工厂方法 模式 

       工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”,即 工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。这样便分担了对象承受的压力,而且使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。

 4.1. 工厂方法模式的组成:
 

       抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由 抽象类 或者 接口 来实现。
     具体工厂类角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的 具体产品 的对象。在java中由具体的 类 来实现。
       抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般 抽象类 或者 接口 来实现。
       具体产品类角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的 类 来实现。
 
 4.2. 案例

 后台输出   Driving BMW

五。抽象工厂 模式

 5.1.抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 抽象工厂模式的用意:给客户端提供一个接口,可以创建多个产品族中的产品对象。(产品族:位于不同产品等级结构中,功能相关联的产品组成的家族)
在下面的结构图中,我们可以更好地解释抽象工厂模式的定义。我们的抽象工厂中包含一系列的去构造一个抽象产品的方法,而具体产品的实现则是放在了具体工厂(图中的A和B)中进行。



 5.2. 抽象工厂模式的各个角色和工厂方法模式如出一辙,可参照 工厂方法模式。

 5.3. 案例分析
       结合例子:当每个抽象产品都有多于一个的具体子类的时候(空调有型号A和B两种,发动机也有型号A和B两种),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品空调有两个具体产品空调A和空调B)。抽象工厂模式提供两个具体工厂角色(宝马系列工厂和奥迪系列工厂),分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
       代码如下:
       产品类:

         工厂类

     客户类:

 后台输出 :



 5.4. 工厂方法模式     VS      抽象工厂模式
        工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
        工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

六、总结

 6.1. 简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
 6.2. 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
 6.3. 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类。它针对的是有多个产品的等级结构,而工厂方法模式针对的是一个产品的等级结构。
阅读全文
2 0