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

資訊專欄INFORMATION COLUMN

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

wemall / 1521人閱讀

摘要:緊接著上節(jié)講到抽象工廠模式,接下來講建造者模式。針對需求,我們需要考慮擴(kuò)展性,針對上面三個(gè)問題,我們考慮用建造者模式來設(shè)計(jì)。

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

水果店隨著業(yè)務(wù)發(fā)展,想要舉行各類促銷活動(dòng)來提升人氣。

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

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

問題:

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

2.套餐的創(chuàng)建步驟基本確定,設(shè)置商品價(jià)格/設(shè)置折扣/得到結(jié)算價(jià)。

3.會(huì)不斷的推出新的套餐。

針對需求,我們需要考慮擴(kuò)展性,針對上面三個(gè)問題,我們考慮用建造者模式來設(shè)計(jì)。

1.創(chuàng)建步驟

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

結(jié)構(gòu)圖:


代碼如下:

//創(chuàng)建一個(gè)水果套餐Meal類
public class FruitMeal {

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

    private int totalPrice;//套餐總價(jià)

    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接口:

//創(chuàng)建一個(gè)Builder類,實(shí)際的builder類負(fù)責(zé)創(chuàng)建套餐FruitMeal 對象。
public interface Builder {//也是工廠

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

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


/**
 * 節(jié)假日套餐建造工廠
 *
 */
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);//折扣價(jià)格對一個(gè)套餐來,是固定的
        fruitMeal.init();
        return fruitMeal;
    }
}
/**
 * 會(huì)員套餐建造工廠
 * 
 */
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 {//收銀臺(tái)---導(dǎo)演類

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

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

        FruitMeal fruitMeal = builder.getFruitMeal();


        int cost = fruitMeal.cost();
        System.out.println("本套件花費(fèi):"+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();
    
}

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

建造者模式類圖

主要有:

1是Builder接口,抽象出生產(chǎn)某個(gè)復(fù)雜的對象的步驟

2復(fù)雜對象用一個(gè)類

3Builder實(shí)現(xiàn)類

在業(yè)務(wù)需求開發(fā)中,適當(dāng)?shù)氖褂迷O(shè)計(jì)模式將大大提高系統(tǒng)的可擴(kuò)展性可讀性,業(yè)務(wù)場景需要多考慮清晰。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74534.html

相關(guān)文章

  • 細(xì)談JavaScript中的一些設(shè)計(jì)模式

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

    30e8336b8229 評論0 收藏0
  • 我的Java設(shè)計(jì)模式-建造模式

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

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

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

    sanyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<