国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

工廠模式(二)之建造者模式

wemall / 1522人閱讀

摘要:緊接著上節講到抽象工廠模式,接下來講建造者模式。針對需求,我們需要考慮擴展性,針對上面三個問題,我們考慮用建造者模式來設計。

緊接著上節講到抽象工廠模式,接下來講建造者模式。

水果店隨著業務發展,想要舉行各類促銷活動來提升人氣。

會員購買橘子+蘋果+香蕉(可能還有別的水果)立減15元

假日促銷則橘子+蘋果+香蕉(可能還有別的水果)立減10元

問題:

1.套餐組合包含各類水果的組合,較復雜(后續套餐越來越復雜)。

2.套餐的創建步驟基本確定,設置商品價格/設置折扣/得到結算價。

3.會不斷的推出新的套餐。

針對需求,我們需要考慮擴展性,針對上面三個問題,我們考慮用建造者模式來設計。

1.創建步驟

針對這幾個步驟我們抽象出一個建造接口即builder接口用來創建套餐。
套餐是一個對象我們定義一個類封裝好屬性,主要是各個水果的價格,折扣價,還有套餐總價:

結構圖:


代碼如下:

//創建一個水果套餐Meal類
public class FruitMeal {

    private Apple apple;//蘋果--屬性包含價格
    private Banana banana;//香蕉價格
    private Orange orange;    //桔子價格
    private int discount;//折扣價

    private int totalPrice;//套餐總價

    public void setDiscount(int discount) {
        this.discount = discount;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }

    public void setBanana(Banana banana) {
        this.banana = banana;
    }

    public void setOrange(Orange orange) {
        this.orange = orange;
    }

    public int cost(){
        return this.totalPrice;
    }

    public void init() {
        if (null != apple){
            totalPrice += apple.price();
        }
        if (null != orange){
            totalPrice += orange.price();
        }
        if (null != banana){
            totalPrice += banana.price();
        }
        if (totalPrice > 0){
            totalPrice -= discount;
        }
    }

    public void showItems() {
        System.out.println("totalPrice:" + totalPrice);
    }
}

builder接口:

//創建一個Builder類,實際的builder類負責創建套餐FruitMeal 對象。
public interface Builder {//也是工廠

    void buildApple(int price);//設置蘋果
    void buildBanana(int price);//設置香蕉
    void buildOrange(int price);//設置桔子

    FruitMeal getFruitMeal();//返回創建的套餐
}


/**
 * 節假日套餐建造工廠
 *
 */
public class HolidayBuilder implements Builder {
    private FruitMeal fruitMeal = new FruitMeal();

    @Override
    public void buildApple(int price) {
        Apple apple = new Apple();
        apple.setPrice(price);
        fruitMeal.setApple(apple);
    }

    @Override
    public void buildBanana(int price) {
        Banana fruit = new Banana();
        fruit.setPrice(price);
        fruitMeal.setBanana(fruit);
    }

    @Override
    public void buildOrange(int price) {
        Orange fruit = new Orange("Peter",80);
        fruit.setPrice(price);
        fruitMeal.setOrange(fruit);
    }

    @Override
    public FruitMeal getFruitMeal() {
        fruitMeal.setDiscount(15);//折扣價格對一個套餐來,是固定的
        fruitMeal.init();
        return fruitMeal;
    }
}
/**
 * 會員套餐建造工廠
 * 
 */
public class OldCustomerBuilder implements Builder {
    private FruitMeal fruitMeal = new FruitMeal();

    @Override
    public void buildApple(int price) {
        Apple apple = new Apple();
        apple.setPrice(price);
        fruitMeal.setApple(apple);
    }

    @Override
    public void buildBanana(int price) {
        Banana fruit = new Banana();
        fruit.setPrice(price);
        fruitMeal.setBanana(fruit);
    }

    @Override
    public void buildOrange(int price) {
        Orange fruit = new Orange("Peter",80);
        fruit.setPrice(price);
        fruitMeal.setOrange(fruit);
    }

    @Override
    public FruitMeal getFruitMeal() {
        fruitMeal.setDiscount(10);
        fruitMeal.init();
        return fruitMeal;
    }
}



 public class FruitMealController {//收銀臺---導演類

    public void construct() {
//        Builder builder = new HolidayBuilder();
        Builder builder = new OldCustomerBuilder();//spring注入方法,

        //以下代碼模板,輕易是不變的
        builder.buildApple(120);//創建蘋果設置價格
        builder.buildBanana(80);//創建香蕉設置香蕉價格
        builder.buildOrange(50);//創建桔子設置價格

        FruitMeal fruitMeal = builder.getFruitMeal();


        int cost = fruitMeal.cost();
        System.out.println("本套件花費:"+cost);
    }

    public static void main(String[] args) {
        new FruitMealController().construct();
    }

}

public class Apple implements Fruit {
    private int price = 100;

    public Apple(){

    }

    public Apple(int price){
        this.price = price;
    }

    public void pack(AppleBag bag){
        bag.pack();
    }

    @Override
    public int price() {
        return price;
    }

    @Override
    public void draw() {
        System.out.print("蘋果紅富士");
    }

    public void setPrice(int price) {
        this.price = price;
    }



}



 public class Banana implements Fruit {
    private int price = 60;
    @Override
    public int price() {
        return price;
    }

    public void pack(BananaBag bag){
        bag.pack();
    }
    @Override
    public void draw() {
        System.out.print("仙人蕉");
    }

    

    public void setPrice(int price) {
        this.price = price;
    }
}

public class Orange implements Fruit {
    private String name = "";
    private int price = 70;

    public Orange(String name,int price){
        this.price = price;
        this.name = name;
    }

    public void pack(OrangeBag bag){
        bag.pack();
    }

    @Override
    public int price() {
        return price;
    }

    @Override
    public void draw() {
        System.out.print("砂糖桔");
    }


    public void setPrice(int price) {
        this.price = price;
    }
}
    
    /**
 * 水果接口
 */
public interface Fruit {

    int price();

    void draw();
    
}

使用建造者模式,使用建造工廠(節假日套餐工廠丶會員套餐工廠)生產出套餐,每多一個套餐,新增一個建造工廠,這實際上是用了工廠方法模式
只是建造工廠有一定相同的步驟。

建造者模式類圖

主要有:

1是Builder接口,抽象出生產某個復雜的對象的步驟

2復雜對象用一個類

3Builder實現類

在業務需求開發中,適當的使用設計模式將大大提高系統的可擴展性可讀性,業務場景需要多考慮清晰。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74534.html

相關文章

  • 細談JavaScript中的一些設計模式

    摘要:注意事項聲明函數時候處理業務邏輯區分和單例的區別,配合單例實現初始化構造函數大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設計模式] 常見設計模式 一直對設計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設計模式,并總結了一下。 設計模式簡介 設計模式概念解讀 設計模式的發展與在JavaScript中的應用 ...

    30e8336b8229 評論0 收藏0
  • 我的Java設計模式-建造模式

    摘要:汽車本身就是復雜產品對象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優缺點優點降低代碼耦合度。 在未上大學之前,一直有個夢想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設計的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現在沒實現我的dream,但夢想還是得有的。 說到...

    elisa.yang 評論0 收藏0
  • 深入理解建造模式 ——組裝復雜的實例

    摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...

    sanyang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<