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

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

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

因为现在一直在用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值