Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例詳解
本文實(shí)例講述了Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例。分享給大家供大家參考,具體如下:
一、模式定義
抽象工廠模式提供了一個(gè)接口,用于創(chuàng)建相關(guān)或者依賴對(duì)象的家族,而不需要指定具體實(shí)現(xiàn)類。
抽象工廠模式允許客戶使用抽象接口來創(chuàng)建一組相關(guān)的產(chǎn)品,客戶類和工廠類分開,客戶需要任何產(chǎn)品的時(shí)候,只需要向工廠請(qǐng)求即可,客戶無須修改就可以獲得新產(chǎn)品。
二、模式舉例
1 模式分析
我們借用爸爸和兒子到肯德基店消費(fèi)這一場(chǎng)景來說明這一模式,進(jìn)行抽象分析后的截圖如下
2 抽象工廠模式的靜態(tài)建模
3 代碼示例
3.1 抽象食物的建立
抽象食物——AbstractBaseFood
package com.demo.factory.model; /** * * 食物基類 * * @author maofw * */ public abstract class AbstractBaseFood { // 類別 protected String kind; // 數(shù)量 protected int num; // 價(jià)格 protected float price; // 合計(jì) public float totalPrice() { return this.num * this.price; } }
食物接口——IFood
package com.demo.factory.model; /** * 抽象食物接口 * * @author maofw * */ public interface IFood { /** * 打印輸出食物信息 */ void printMesage(); }
3.2 建立不同食物的抽象基類
漢堡基類——Hamburg
package com.demo.factory.model; /** * 漢堡基類 * * @author maofw * */ public abstract class Hamburg extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "風(fēng)味漢堡,\t單價(jià):" + this.price + ",\t數(shù)量:" + this.num + ",\t合計(jì):" + this.totalPrice()); } }
雞翅基類——ChickenWings
package com.demo.factory.model; /** * 雞翅基類 * * @author maofw * */ public abstract class ChickenWings extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "風(fēng)味雞翅,\t單價(jià):" + this.price + ",\t數(shù)量:" + this.num + ",\t合計(jì):" + this.totalPrice()); } }
薯?xiàng)l基類——FrenchFries
package com.demo.factory.model; /** * 薯?xiàng)l基類 * * @author maofw * */ public abstract class FrenchFries extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "風(fēng)味薯?xiàng)l,\t單價(jià):" + this.price + ",\t數(shù)量:" + this.num + ",\t合計(jì):" + this.totalPrice()); } }
飲料基類——Beverage
package com.demo.factory.model; /** * 飲料基類 * * @author maofw * */ public abstract class Beverage extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "飲料,\t單價(jià):" + this.price + ",\t數(shù)量:" + this.num + ",\t合計(jì):" + this.totalPrice()); } }
3.3 創(chuàng)建具體的食物
麻辣雞腿漢堡——ChinaHanburm
package com.demo.factory.model.kfc; import com.demo.factory.model.Hamburg; /** * 中國(guó)風(fēng)味的麻辣雞腿漢堡 * * @author maofw * */ public class ChinaHanburm extends Hamburg { /** * 構(gòu)造方法 * * @param kind * @param price * @param num */ public ChinaHanburm(int num) { this.kind = "麻辣"; this.price = 14.0f; this.num = num; } }
奧爾良雞翅——ChinaChickenWings
package com.demo.factory.model.kfc; import com.demo.factory.model.ChickenWings; /** * 雞翅實(shí)現(xiàn)類 * * @author maofw * */ public class ChinaChickenWings extends ChickenWings { public ChinaChickenWings(int num) { this.kind = "奧爾良"; this.price = 2.5f; this.num = num; } }
薯?xiàng)l——ChinaFrenchFries
package com.demo.factory.model.kfc; import com.demo.factory.model.FrenchFries; /** * 薯?xiàng)l實(shí)現(xiàn)類 * * @author maofw * */ public class ChinaFrenchFries extends FrenchFries { public ChinaFrenchFries(int num) { this.kind = "普通"; this.price = 8.0f; this.num = num; } }
可樂——ChinaBeverage
package com.demo.factory.model.kfc; import com.demo.factory.model.Beverage; /** * 飲料實(shí)現(xiàn)類 * * @author maofw * */ public class ChinaBeverage extends Beverage { public ChinaBeverage(int num) { this.kind = "可樂"; this.price = 7.0f; this.num = num; } }
3.4 建立工廠
創(chuàng)建抽象肯德基工廠——IKfcFactory 生產(chǎn)抽象食物
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; /** * 肯德基抽象工廠基類 * * @author maofw * */ public interface IKfcFactory { // 生產(chǎn)漢堡 public Hamburg createHamburg(int num); // 生產(chǎn)薯?xiàng)l public FrenchFries createFrenchFries(int num); // 生產(chǎn)雞翅 public ChickenWings createChickenWings(int num); // 生產(chǎn)飲料 public Beverage createBeverage(int num); }
創(chuàng)建具體肯德基工廠——ChinaKfcFactory 生產(chǎn)具體食物
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.ChinaHanburm; public class ChinaKfcFactory implements IKfcFactory { // 生產(chǎn)可樂 public Beverage createBeverage(int num) { return new ChinaBeverage(num); } // 生產(chǎn)奧爾良烤雞翅 public ChickenWings createChickenWings(int num) { return new ChinaChickenWings(num); } // 生產(chǎn)薯?xiàng)l public FrenchFries createFrenchFries(int num) { return new ChinaFrenchFries(num); } // 生產(chǎn)麻辣風(fēng)味雞腿漢堡 public Hamburg createHamburg(int num) { return new ChinaHanburm(num); } }
3.5 創(chuàng)建客戶類——Customer
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; /** * 客戶類 * * @author maofw * */ public class Customer { // 抽象工廠 private IKfcFactory kfcFactory; // 構(gòu)造方法將抽象工廠作為參數(shù)傳入 public Customer(IKfcFactory kfcFactory) { this.kfcFactory = kfcFactory; } /** * 訂購(gòu)食物 */ // 訂購(gòu)麻辣雞腿漢堡 public float orderHamburg(int num) { // 獲得麻辣雞腿漢堡 Hamburg hamburg = kfcFactory.createHamburg(num); // 輸出訂購(gòu)信息 hamburg.printMesage(); // 返回總價(jià) return hamburg.totalPrice(); } // 訂購(gòu)?qiáng)W爾良烤雞翅 public float orderChickenWings(int num) { // 獲得奧爾良烤雞翅 ChickenWings chickenWings = kfcFactory.createChickenWings(num); // 輸出訂購(gòu)信息 chickenWings.printMesage(); // 返回總價(jià) return chickenWings.totalPrice(); } // 訂購(gòu)薯?xiàng)l public float orderFrenchFries(int num) { // 獲得薯?xiàng)l FrenchFries frenchFries = kfcFactory.createFrenchFries(num); // 輸出訂購(gòu)信息 frenchFries.printMesage(); // 返回總價(jià) return frenchFries.totalPrice(); } // 訂購(gòu)可樂 public float orderBeverage(int num) { // 獲得可樂 Beverage beverage = kfcFactory.createBeverage(num); // 輸出訂購(gòu)信息 beverage.printMesage(); // 返回總價(jià) return beverage.totalPrice(); } }
3.6 故事情節(jié)展現(xiàn)
package com.demo.factory; import java.lang.management.ManagementFactory; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.NumberFormat; import java.util.Arrays; import java.util.Calendar; import java.util.ResourceBundle; import com.demo.factory.custom.Customer; import com.demo.factory.itf.ChinaKfcFactory; import com.demo.factory.itf.IKfcFactory; public class MainApp { /** * 主應(yīng)用程序方法 * * @param args */ public static void main(String[] args) { /** * 定義一個(gè)肯德基(IKfcFactory類型) */ IKfcFactory kfcFactory = new ChinaKfcFactory(); /** * 爸爸和兒子走進(jìn)肯德基,準(zhǔn)備點(diǎn)餐 */ Customer customer = new Customer(kfcFactory); /** * 開始點(diǎn)餐 */ // 一個(gè)麻辣雞腿漢堡 float hamhurgMoney = customer.orderHamburg(1); // 四個(gè)奧爾良烤雞翅 float chickenWingsMoney = customer.orderChickenWings(4); // 一包薯?xiàng)l float frenchFriesMoney = customer.orderFrenchFries(1); // 兩杯可樂 float beverageMoney = customer.orderBeverage(2); System.out.println("總計(jì):" + (hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney)); } }
運(yùn)行結(jié)果:
--麻辣風(fēng)味漢堡, 單價(jià):14.0, 數(shù)量:1, 合計(jì):14.0
--奧爾良風(fēng)味雞翅, 單價(jià):2.5, 數(shù)量:4, 合計(jì):10.0
--普通風(fēng)味薯?xiàng)l, 單價(jià):8.0, 數(shù)量:1, 合計(jì):8.0
--可樂飲料, 單價(jià):7.0, 數(shù)量:2, 合計(jì):14.0
總計(jì):46.0
三、該模式的設(shè)計(jì)原則
1 多用對(duì)象組合,少用繼承
2 針對(duì)抽象編程,不針對(duì)實(shí)現(xiàn)編程
3 產(chǎn)品對(duì)象通過工廠暴露的方法創(chuàng)建
四、使用場(chǎng)合
1 創(chuàng)建產(chǎn)品家族,相關(guān)產(chǎn)品集合在一起使用的時(shí)候;
2 想要提供一個(gè)產(chǎn)品類庫(kù),并只想顯示其接口而不是實(shí)現(xiàn)時(shí);
3 通過組合的方式使用工廠時(shí)。
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Springboot通過谷歌Kaptcha?組件生成圖形驗(yàn)證碼功能
Kaptcha是谷歌開源的一款簡(jiǎn)單實(shí)用的圖形驗(yàn)證碼組件。我個(gè)人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項(xiàng)目中,這篇文章主要介紹了Springboot通過谷歌Kaptcha組件生成圖形驗(yàn)證碼的方法,需要的朋友可以參考下2023-05-05一篇文章教你將JAVA的RabbitMQz與SpringBoot整合
這篇文章主要介紹了如何將JAVA的RabbitMQz與SpringBoot整合,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-09-09SSH框架網(wǎng)上商城項(xiàng)目第9戰(zhàn)之添加和更新商品類別功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第9戰(zhàn)之添加和更新商品類別功能實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-06-06springboot yml配置文件使用@project.xxxx@啟動(dòng)報(bào)錯(cuò)Do not
這篇文章主要介紹了springboot yml配置文件使用@project.xxxx@啟動(dòng)報(bào)錯(cuò)Do not use @ for indentation問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07如何開發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序
HTTP/HTTPS是最常見的協(xié)議套件之一,并且隨著智能手機(jī)的成功,它的應(yīng)用也日益廣泛,因?yàn)閷?duì)于任何公司來說,擁有一個(gè)可以被移動(dòng)設(shè)備訪問的網(wǎng)站幾乎是必須的。下面就來看看如何開發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序2021-06-06換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中
這篇文章主要介紹了換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09