浅谈 java 设计模式--简单工厂模式(Simple Factory pattern)

来源:互联网 发布:qq三国js带什么宠物 编辑:程序博客网 时间:2024/05/22 13:35

 问题:

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

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

类图:

源代码实现:

/** 工厂类*/

public class Factory{

     // 静态工厂方法

     public static Product createProduct(String productName)

         throws BadProductException{        

         if (productName.equalsIgnoreCase("ConcreteProduct1")){

              returnnewConcreteProduct1();

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

              returnnewConcreteProduct2();

         }else{

                thrownewBadProductException("/"" + productName +"/" is not a valid name of product!");

         }

     }

}

 

/** 产品接口*/

publicinterfaceProduct{

     void Operation1();

     void Operation2();

}

 

/**具体产品类ConcreteProduct1*/

publicclassConcreteProduct1implementsProduct{

     privateString attributeA;

     publicString Operation1(){

         return"Operation1";

     }

     publicString Operation2(){

         return"Operation2";

     } 

     publicString getAttributeA(){

         returnthis.attributeA;

     }

     publicvoid setAttributeA(String attributeA){

         this.attributeA = attributeA;

     }

}

 

/** 具体产品类ConcreteProduct2*/

publicclassConcreteProduct2implementsProduct{

     privateString attributeB;

     publicString Operation1() {

         return"Operation1";

     }

 

     publicString Operation2(){

         return"Operation2";

     }

      publicString getAttributeB() {

         returnthis.attributeB;

     }

 

     publicvoid setAttributeB(String attributeB){

         this.attributeB = attributeB;

     }

}

/**客户端代码*/

public class Client{

    public static void main(String[] args){

       try{

          Factory theFactory =newFactory();

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

          lblMessagea.set_Text(ConcreteProduct1.Operation1());

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

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

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

     } catch(BadProductException ex){

      lblMessage.set_Text(ex.get_Message());

     }

  }

}

 

缺点:

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

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

原创粉丝点击