摘要:緊接著上節(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
摘要:注意事項(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)用 ...
摘要:汽車本身就是復(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,但夢想還是得有的。 說到...
摘要:而建造者模式則是要求按照指定的藍(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í)世界中還是在軟件...
閱讀 804·2023-04-25 22:57
閱讀 3057·2021-11-23 10:03
閱讀 620·2021-11-22 15:24
閱讀 3164·2021-11-02 14:47
閱讀 2906·2021-09-10 11:23
閱讀 3124·2021-09-06 15:00
閱讀 3947·2019-08-30 15:56
閱讀 3328·2019-08-30 15:52