`
senton
  • 浏览: 205910 次
  • 性别: Icon_minigender_1
  • 来自: 紫禁城
社区版块
存档分类
最新评论

设计模式之简单工厂模式(“从头开始学习设计模式”系列)

阅读更多

简单工厂模式(Simple Factory<o:p></o:p>

简单工厂模式是类的创建模式,又叫做静态工厂方法模式(Static Factory Method)。简单工厂模式是由一个工厂对象来决定创建出哪一种产品类的对象。

<o:p> </o:p>

       这个模式的一般性结构如下图所示:

                  

<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="WIDTH: 220.5pt; HEIGHT: 109.5pt"><v:imagedata src="file:///C:\DOCUME~1\Senton\LOCALS~1\Temp\msohtml1\03\clip_image001.png" o:title=""></v:imagedata></v:shape>

<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="WIDTH: 220.5pt; HEIGHT: 109.5pt"><v:imagedata src="file:///C:\DOCUME~1\Senton\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title=""></v:imagedata></v:shape>

    简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的对象,下面以一个示意性的实现来说明简单工厂模式的结构,如下图所示:

                            <v:shape id="_x0000_i1026" type="#_x0000_t75" style="WIDTH: 287.25pt; HEIGHT: 139.5pt"><v:imagedata src="file:///C:\DOCUME~1\Senton\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>

       从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色这三个角色:

     工厂类(Createor)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑,工厂类在客户端的直接调用下创建出产品对象,它往往由一个具体Java类实现。<o:p></o:p>

     抽象产品(Product)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或者是它们共同拥有的接口。此角色可以由一个Java接口或者Java抽象类实现。

     具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,此角色由一个具体Java类实现。

<o:p> </o:p>

工厂类的示意性源代码如下:

public class Creator {

 

      /**

             *  静态工厂方法

             */

       public static  Product factory() {

              return new ConcreteFactory();

       }

        

}

可以看出,这个工厂方法创建了一个新的具体产品的实例返回给调用者。

<o:p> </o:p>

抽象角色Product接口的源代码:

public interface Product {

 

}

在这里,我给出的只是一个最简单的标识接口(关于标识接口的介绍,请参看我前

blog的介绍:“(标识)接口的重要性”一文)。

<o:p> </o:p>

       具体产品角色的源代码:

       public class ConcreteProduct implements Product {

 

       public ConcreteProduct() {

       }

        

}

<o:p> </o:p>

这里给出的是最简单的实现,在项目的实际应用中会遇到多个具体产品类的情况。

<o:p> </o:p>

       那么,你也许会问,“对于这个抽象产品类角色,我们何时该使用接口,何时该使用抽象类呢?”。好问题,如果模式所产生的具体产品类彼此之间没有共同的商业逻辑,那么抽象产品角色可以由一个Java接口来扮演,相反,如果这些具体产品类彼此之间确实有共同的商业逻辑,那么,这些公有的逻辑代码应该移到抽象角色里面,这就意味着抽象角色应当由一个Java抽象类来扮演。 在一个类型的等级结构里面,共同的代码应当尽量往上移,以达到共享的目的,如下图所示:

       <v:shape id="_x0000_i1027" type="#_x0000_t75" style="WIDTH: 340.5pt; HEIGHT: 291pt"><v:imagedata src="file:///C:\DOCUME~1\Senton\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:title="sim"></v:imagedata></v:shape>

      

       值得注意的有三点:

1.       如果系统中仅有一个具体产品角色的话,那么,可以省略掉抽象产品角色,当然这样的话,就不利于扩展。我们使用接口或抽象类的原因就是为了遵循“开闭原则(即对扩展开放,对修改关闭)”。

2.       在有些情况下,工厂角色可以由抽象产品角色来扮演,典型的应用就是java.text.DateFormat类,一个抽象产品类同时是子类的工厂。

3.       三个角色全部合并成一个类,这个类自行创建自己的实例,例如:

public class ConcreteProduct{

        public ConcreteProduct(){

        }

<o:p> </o:p>

        /**

          *  静态工厂方法

*/

        public static ConcreteProduct factory(){

               return new ConcreteProduct();

        }

}

       看上去怎么那么象单例模式?的确很像,但是并不等于单例模式。关于单例模式请继续关注后面设计模式的介绍。

 
分享到:
评论

相关推荐

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...

    二十三种设计模式【PDF版】

    之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...

    china-pub版-设计模式

    4. **简化设计过程**:设计模式提供了一系列经过验证的解决方案,可以帮助设计者快速解决问题,避免陷入常见的设计陷阱。 #### 六、设计模式的学习和发展 学习设计模式是一个逐步积累的过程,对于新手来说尤为重要...

    设计模式迷你手册

    5. **加速开发过程**:设计模式提供了解决常见问题的标准模板,这使得开发者不必从头开始思考每一个解决方案。 ### 常见的设计模式分类 设计模式通常被分为三大类:创建型模式、结构型模式和行为型模式。 #### ...

    关于java23种设计模式的有趣见解

    关于Java23种设计模式的有趣见解,是一个深入浅出探讨设计模式在实际场景中应用的例子集合。...通过学习和运用这些设计模式,开发者可以在软件设计中更好地解决复杂问题,提高代码质量和可维护性。

    学设计模式.rar

    这份名为“学设计模式”的压缩包文件显然包含了一系列关于设计模式的学习资料,旨在帮助学习者深入理解和掌握这一关键概念。 设计模式分为三大类:创建型、结构型和行为型模式。每一种模式都描述了一个在我们反复...

    设计模式.pdf

    3. **应用模块容器**:模块化是现代软件开发的重要趋势之一,通过设计模式可以有效地实现模块间的解耦合,提高系统的灵活性。 4. **服务容器**:在服务端开发中,使用设计模式来管理和协调不同服务之间的交互,可以...

    设计模式可复用面向对象软件基础 pdf

    设计模式是软件开发中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式是经过时间和经验验证的解决方案,可以帮助...因此,深入学习和理解设计模式,将对你的职业生涯有着积极且深远的影响。

    GOFDesignPatterns:GOF设计模式(从头开始的设计模式)

    GOF设计模式,全称为GoF设计模式,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师在1994年提出的23种设计模式,是软件工程领域中的经典之作。这些模式是解决软件设计中常见问题的经验总结,...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是从头开始创建。这种模式在系统中需要大量相似对象时特别有用,可以减少代码重复,提高效率。 在Java等...

    设计模式培训-strategy

    - **复用性**:设计模式使得开发者能够复用先前成功的设计和架构,减少了从头开始设计解决方案的需求。 - **指导性**:设计模式作为一种指导思想,有助于开发者做出更优的设计决策,提高软件质量。 - **沟通工具**:...

    设计模式迷你手册.rar

    设计模式的核心理念是重用已验证的解决方案,而不是从头开始。每个模式都描述了一个在我们所遇到的问题中,经常出现的解决方案。这些解决方案已经被广泛接受并经过了时间的考验,可以提高代码的可读性、可维护性和...

    设计模式--java版.rar

    设计模式的核心思想在于重用已验证的解决方案,而不是从头开始解决每个问题。它们提供了一种标准化的沟通方式,使得开发者可以更容易地理解彼此的代码。同时,设计模式也有助于提升系统的可扩展性和可维护性,因为...

Global site tag (gtag.js) - Google Analytics