1. 程式人生 > >設計模式(二)---工廠方法模式

設計模式(二)---工廠方法模式

ack cto sys alt 修改 spa 抽象類 .com desc

1、簡介:工廠方法模式是類的創建模式,又叫虛擬構造子模式或是多態性工廠模式,它的實現方式是創建一個工廠接口,將實際創建對象的的工作轉移到工廠子類中,在系統的擴展中,可以在不修改工廠角色的情況下引進新的產品。

2、工廠方法模式UML

  技術分享

3、工廠方法模式情景示意性類圖

技術分享

4、類圖分析

  從以上兩個圖可以看出,工廠方法模式涉及到以下四個角色

  4、1:抽象工廠:擔任這個角色的是工廠方法模式的核心,它與應用無關,任何在模式中創建對象的工廠都必須實現這個接口,在實際應用中,這個角色由java抽象類或接口來實現

  4、2:具體工廠:擔任這個角色的是抽象工廠的具體實現類,具體工廠含有業務邏輯,並受到客戶端的調用創建產品對象,這個角色由java類來實現。

  4、3:抽象產品:這個角色是工廠方法模式創建的對象的超類型(父類),在實際應用中,由java抽象類或是接口來實現

  4、4:具體產品:這個角色實現了抽象產品角色聲明的接口,工廠方法模式所創建的每一個對象都是某個具體產品角色的實例。

5、源代碼

  5.1:創建一個商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: ProductInterface 
* @Description: 產品接口,所有產品都必須實現此接口
*  
**********************************************************
 
*/ public interface Product { public void say(); }

  5.2:創建一個食品類 實現商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: Food 
* @Description: 食品類 
*  
**********************************************************
 */
public class Food implements
Product{ @Override public void say() { System.out.println("我是食品"); } }

  5.3:創建一個水果類 實現商品接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: Fruits 
* @Description: 水果類 
*  
**********************************************************
 */
public class Fruits  implements Product{

    @Override
    public void say() {
        System.out.println("我是水果");
    }
}

  5.4:創建工廠接口,所有具體工廠角色必須實現這個接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FactoryInterface 
* @Description: 工廠接口,所有具體工廠角色必須實現此接口 
*  
**********************************************************
 */
public interface FactoryInterface {
    public Product factory();
}

  5.5:創建食品工廠類,實現工廠接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FoodFactory 
* @Description: 食品工廠類
*  
**********************************************************
 */
public class FoodFactory implements FactoryInterface{

    @Override
    public Product factory() {
        // TODO Auto-generated method stub
        return new Food();
    }
}

  5.6:創建水果工廠類,實現工廠接口

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FruitsFactory 
* @Description: 水果工廠類
*  
**********************************************************
 */
public class FruitsFactory implements FactoryInterface{

    @Override
    public Product factory() {
        // TODO Auto-generated method stub
        return new Fruits();
    }

}

  5.7:創建工廠方法模式測試客戶端

package FactoryMethod;
/**
 * ********************************************************  
* @ClassName: FactoryMethodTest 
* @Description: 工廠方法模式測試類
*  
**********************************************************
 */
public class FactoryMethodTest {

    public static void main(String[] args) {
        //獲取食品工廠對象
        FactoryInterface foodFactory = new FoodFactory();
        //獲取水果工廠對象
        FactoryInterface fruitsFactory = new FruitsFactory();
        //獲取食品對象
        Product food = foodFactory.factory();
        //獲取水果對象
        Product fruits =fruitsFactory.factory();
        //調用對象中的方法
        food.say();
        fruits.say();
    }

}

  5.8:運行,得到如下結果

技術分享

設計模式(二)---工廠方法模式