摘要:緊接著上節講到抽象工廠模式,接下來講建造者模式。針對需求,我們需要考慮擴展性,針對上面三個問題,我們考慮用建造者模式來設計。
緊接著上節講到抽象工廠模式,接下來講建造者模式。
水果店隨著業務發展,想要舉行各類促銷活動來提升人氣。
會員購買橘子+蘋果+香蕉(可能還有別的水果)立減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中的應用 ...
摘要:汽車本身就是復雜產品對象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優缺點優點降低代碼耦合度。 在未上大學之前,一直有個夢想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設計的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現在沒實現我的dream,但夢想還是得有的。 說到...
摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...
閱讀 807·2023-04-25 22:57
閱讀 3060·2021-11-23 10:03
閱讀 622·2021-11-22 15:24
閱讀 3164·2021-11-02 14:47
閱讀 2908·2021-09-10 11:23
閱讀 3127·2021-09-06 15:00
閱讀 3949·2019-08-30 15:56
閱讀 3332·2019-08-30 15:52