Java工厂设计模式

1 Java工厂设计模式的介绍

工厂设计模式或工厂方法设计模式,表示只需定义用于创建对象的接口或抽象类,但让子类确定要实例化的类。换句话说,子类负责创建该类的实例。

工厂设计模式也称为虚拟构造函数。

2 Java工厂设计模式的好处

  • 工厂设计模式允许子类选择要创建的对象的类型。
  • 工厂设计模式消除了将特定于应用程序的类绑定到代码中的需要,从而实现了了代码的松散耦合。这意味着代码仅与接口或抽象类进行交互,因此它将与实现该接口或扩展该抽象类的任何类一起使用。

3 Java工厂设计模式的使用

  • 当一个类不知道要创建什么子类时。
  • 当一个类希望其子类指定要创建的对象时。
  • 当父类选择为其子类创建对象时。

4 Java工厂设计模式的UML

5 Java工厂设计模式的案例

5.1 创建一个Pan抽象类

package com.yiidian;
/**
 * 一点教程网: http://www.yiidian.com
 */
abstract class Plan{
      protected double rate;
      abstract void getRate();
   
      public void calculateBill(int units){
           System.out.println(units*rate);
      }
}

5.2 创建Plan抽象类的实现类

package com.yiidian;
/**
 * 一点教程网: http://www.yiidian.com
 */
class DomesticPlan extends Plan{
    public void getRate(){
        rate=3.50;
    }
   
}
package com.yiidian;
/**
 * 一点教程网: http://www.yiidian.com
 */
class  CommercialPlan extends Plan {
    //@override
    public void getRate() {
        rate = 7.50;
    }
}
package com.yiidian;
/**
 * 一点教程网: http://www.yiidian.com
 */
class  InstitutionalPlan extends Plan {
    //@override
    public void getRate() {
        rate = 5.50;
    }
}

5.3 创建GetPlanFactory以根据给定的信息生成实现类的对象

package com.yiidian;
/**
 * 一点教程网: http://www.yiidian.com
 */
class GetPlanFactory{
      
   //use getPlan method to get object of type Plan   
       public Plan getPlan(String planType){  
            if(planType == null){  
             return null;  
            }  
          if(planType.equalsIgnoreCase("DOMESTICPLAN")) {  
                 return new DomesticPlan();  
               }   
           else if(planType.equalsIgnoreCase("COMMERCIALPLAN")){  
                return new CommercialPlan();  
            }   
          else if(planType.equalsIgnoreCase("INSTITUTIONALPLAN")) {  
                return new InstitutionalPlan();  
          }  
      return null;  
   }  
}

5.4 使用GetPlanFactory生成实现类的对象来生成Bill

package com.yiidian;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 一点教程网: http://www.yiidian.com
 */
class GenerateBill{
    public static void main(String args[])throws IOException {
      GetPlanFactory planFactory = new GetPlanFactory();  
        
      System.out.print("Enter the name of plan for which the bill will be generated: ");  
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  
      String planName=br.readLine();  
      System.out.print("Enter the number of units for bill will be calculated: ");  
      int units=Integer.parseInt(br.readLine());  
  
      Plan p = planFactory.getPlan(planName);  
      //call getRate() method and calculateBill()method of DomesticPaln.  
  
       System.out.print("Bill amount for "+planName+" of  "+units+" units is: ");  
           p.getRate();  
           p.calculateBill(units);  
            }  
    }

以上程序输出结果为:

 

 

热门文章

优秀文章