天天看點

設計模式那點事讀書筆記(2)----抽象工廠模式

抽象工廠模式:

  此模式提供了一個接口,用于建立相關或者依賴對象的家族,而不需要指定具體實作類.

解決什麼問題:

  抽象工廠模式允許客戶在使用抽象接口來建立一組相關的産品,客戶類和工廠類分開,客戶需要任何産品的時候,隻需要向工廠請求即可,客戶無須修改就可以獲得新産品.進而實作客戶從具體的産品中解耦.

UML:

  

設計模式那點事讀書筆記(2)----抽象工廠模式

代碼結構:

  

設計模式那點事讀書筆記(2)----抽象工廠模式

代碼:

  定義抽象産品:

package com.demo.factory.model;

/**
 * 抽象産品
 */
public abstract class AbstractBaseFood {
    protected String kind;
    protected int num;
    protected float price;

    public float totalPrice() {
        return this.num * this.price;
    }
}
           

  産品接口:

package com.demo.factory.model;

/**
 * 抽象産品接口
 */
public interface IFood {
    void printMessage();
}
           

  抽象具體産品-Beverage類:

package com.demo.factory.model;

/**
 * 抽象具體産品-Beverage
 */
public abstract class Beverage extends AbstractBaseFood implements IFood{
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "飲料, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
    }
}
           

  抽象具體産品-ChickenWings類:

package com.demo.factory.model;

/**
 * 抽象具體産品-ChickenWings
 */
public abstract class ChickenWings extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "風味雞翅, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
    }
}
           

  抽象具體産品-FrenchFries類:

package com.demo.factory.model;

/**
 * 抽象具體産品-FrenchFries
 */
public abstract class FrenchFries extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "風味薯條, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
    }
}
           

  抽象具體産品-Hamburg類:

package com.demo.factory.model;

/**
 * 抽象具體産品-Hamburg
 */
public abstract class Hamburg extends AbstractBaseFood implements IFood {
    @Override
    public void printMessage() {
        System.out.println("--" + this.kind + "風味漢堡, \t 單價: " + this.price + ", .\t 數量: " + this.num + ", \t 合計: " + this.totalPrice());
    }
}
           

  具體産品-ChinaBeverage類:

package com.demo.factory.model.kfc;

import com.demo.factory.model.Beverage;

/**
 * 具體産品-ChinaBeverage
 */
public class ChinaBeverage extends Beverage {
    public ChinaBeverage(int num) {
        this.kind = "可樂";
        this.price = 8.0f;
        this.num = num;
    }
}
           

  具體産品-ChinaChickenWings類:

package com.demo.factory.model.kfc;

import com.demo.factory.model.ChickenWings;

/**
 * 具體産品-ChinaChickenWings
 */
public class ChinaChickenWings extends ChickenWings {
    public ChinaChickenWings(int num) {
        this.kind = "奧爾良";
        this.price = 2.5f;
        this.num = num;
    }
}
           

  具體産品-ChinaFrenchFries類:

package com.demo.factory.model.kfc;

import com.demo.factory.model.FrenchFries;

/**
 * 具體産品-ChinaFrenchFries
 */
public class ChinaFrenchFries extends FrenchFries {
    public ChinaFrenchFries(int num) {
        this.kind = "普通";
        this.price = 8.0f;
        this.num = num;
    }
}
           

  具體産品-ChinaHamburg類:

package com.demo.factory.model.kfc;

import com.demo.factory.model.Hamburg;

/**
 * 具體産品-ChinaHumburg
 */
public class ChinaHamburg extends Hamburg {
    public ChinaHamburg(int num) {
        this.kind = "麻辣";
        this.price = 14.0f;
        this.num = num;
    }
}
           

  抽象工廠接口:

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 抽象工廠接口
 */
public interface IKfcFactory {
    Hamburg createHamburg(int num);
    ChickenWings createChickenWings(int num);
    FrenchFries createFrenchFries(int num);
    Beverage createBeverage(int num);
}
           

  實際工廠:

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import com.demo.factory.model.kfc.ChinaBeverage;
import com.demo.factory.model.kfc.ChinaChickenWings;
import com.demo.factory.model.kfc.ChinaFrenchFries;
import com.demo.factory.model.kfc.ChinaHamburg;

/**
 * 實際工廠
 */
public class ChinaKfcFactory implements IKfcFactory {
    @Override
    public Hamburg createHamburg(int num) {
        return new ChinaHamburg(num);
    }

    @Override
    public ChickenWings createChickenWings(int num) {
        return new ChinaChickenWings(num);
    }

    @Override
    public FrenchFries createFrenchFries(int num) {
        return new ChinaFrenchFries(num);
    }

    @Override
    public Beverage createBeverage(int num) {
        return new ChinaBeverage(num);
    }
}
           

  客戶類:

package com.demo.factory.custom;

import com.demo.factory.itf.IKfcFactory;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 客戶類
 */
public class Customer {
    private IKfcFactory kfcFactory;

    public Customer(IKfcFactory kfcFactory) {
        this.kfcFactory = kfcFactory;
    }

    public float orderHamburg(int num) {
        Hamburg hamburg = kfcFactory.createHamburg(num);
        hamburg.printMessage();
        return hamburg.totalPrice();
    }

    public float orderChickenWings(int num) {
        ChickenWings chickenWings = kfcFactory.createChickenWings(num);
        chickenWings.printMessage();
        return chickenWings.totalPrice();
    }

    public float orderFrenchFries(int num) {
        FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
        frenchFries.printMessage();
        return frenchFries.totalPrice();
    }

    public float orderBeverage(int num) {
        Beverage beverage = kfcFactory.createBeverage(num);
        beverage.printMessage();
        return beverage.totalPrice();
    }
}
           

  

轉載于:https://www.cnblogs.com/arctique/p/5747117.html

繼續閱讀