《Java与模式》学习笔记之一――简单工厂模式(Simple Factory Pattern)

    技术2022-05-11  84

    很久没有好好看书了, 空虚的很, 所以打算系统的学习一下设计模式, 为明年的论文做准备。 了督促自己, 写此学习笔记。

    学习贵在坚持, 听力贵在坚持, 锻炼身体贵在坚持, 所以, 做好任何事情都贵在坚持。

    因为现在一直在用J#,所以所有源代码都用J#实现, 在VS2005环境中.

    其实很多人听说我在用J#的时候, 第一个直接反映就是眼睛放大,然后追问为什么选择现在几乎没有人在用的J#? 其实这是老板决定的, 更进一步说是用Rose建模和选择比较纯粹的面向对象的Java语言决定了使用J#.用了这段时间感觉还可以.

    设计模式的学习笔记已经有若干人做过了, 但是用J#做源码实现恐怕还不多吧!?

     

       下面就开始介绍简单工厂模式

     

     

    简单工厂模式又称静态工厂方法, 是类的创建模式。

     

    问题:

     

    为了提高内聚(Cohesion)和松散耦合(Coupling), 我们会经常抽象出一些类的公共接口以形成抽象基类和接口。简单工厂模式提供创建对象的接口,封装了对象的创建, 由工厂类根据传入的参数决定创建哪一种产品类。

     

    类图:

    源代码实现:

    /**

     * 工厂类

     */

    public class Factory

    {

         // 静态工厂方法

         public static Product createProduct(String productName)

             throws BadProductException

         {        

             if (productName.equalsIgnoreCase("ConcreteProduct1"))

                  return new ConcreteProduct1();

             else if (productName.equalsIgnoreCase("ConcreteProduct2"))

                  return new ConcreteProduct2();

             else

                    throw new BadProductException("/"" + productName + "/" is not a valid name of product!");

         }

    }

     

    /**

     * 产品接口

     */

    public interface Product

    {

         void Operation1();

         void Operation2();

    }

     

    /**

     * 具体产品类ConcreteProduct1

     */

    public class ConcreteProduct1 implements Product

    {

         private String attributeA;

         public String Operation1()

         {

             return "Operation1";

         }

     

         public String Operation2()

         {

             return "Operation2";

         } 

         public String getAttributeA()

         {

             return this.attributeA;

         }

     

         public void setAttributeA(String attributeA)

         {

             this.attributeA = attributeA;

         }

    }

     

    /**

     * 具体产品类ConcreteProduct2

     */

    public class ConcreteProduct2 implements Product

    {

         private String attributeB;

         public String Operation1()

         {

             return "Operation1";

         }

     

         public String Operation2()

         {

             return "Operation2";

         }

          public String getAttributeB()

         {

             return this.attributeB;

         }

     

         public void setAttributeB(String attributeB)

         {

             this.attributeB = attributeB;

         }

    }

    /**

    * 客户端代码

    */

    try

    {

          Factory theFactory = new Factory();

          Product aConcreteProduct1 = theFactory.createProduct("ConcreteProduct1");

          lblMessagea.set_Text(ConcreteProduct1.Operation1());

     

    缺点:

     

     

    1)  增加新的具体产品类, 会导致工厂类的修改。功能扩展比较困难。

    2)由于使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

          Product aConcreteProduct2 = theFactory.createProduct("ConcreteProduct2");

          // 运行下一句时产生异常

          Product aConcreteProduct3 = theFactory.createProduct("ConcreteProduct3");

     

    }

    catch(BadProductException ex)

    {

          lblMessage.set_Text(ex.get_Message());

    }

     


    最新回复(0)