本文實例講述了Java使用抽象工廠模式實現的肯德基消費案例。分享給大家供大家參考,具體如下:
一、模式定義
抽象工廠模式提供了一個接口,用於創建相關或者依賴對象的家族,而不需要指定具體實現類。
抽象工廠模式允許客戶使用抽象接口來創建一組相關的產品,客戶類和工廠類分開,客戶需要任何產品的時候,只需要向工廠請求即可,客戶無須修改就可以獲得新產品。
二、模式舉例
1 模式分析
我們藉用爸爸和兒子到肯德基店消費這一場景來說明這一模式,進行抽象分析後的截圖如下
2 抽象工廠模式的靜態建模
3 代碼示例
3.1 抽象食物的建立
抽象食物――AbstractBaseFood
package com.demo.factory.model;/** * * 食物基類* * @author maofw * */public abstract class AbstractBaseFood{ // 類別protected String kind; // 數量protected int num; // 價格protected float price; // 合計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 + "風味漢堡,/t單價:" + this.price + ",/t數量:" + this.num + ",/t合計:" + 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 + "風味雞翅,/t單價:" + this.price + ",/t數量:" + this.num + ",/t合計:" + this.totalPrice()); }}薯條基類――FrenchFries
package com.demo.factory.model;/** * 薯條基類* * @author maofw * */public abstract class FrenchFries extends AbstractBaseFood implements IFood{ public void printMesage() { System.out.println("--" + this.kind + "風味薯條,/t單價:" + this.price + ",/t數量:" + this.num + ",/t合計:" + 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單價:" + this.price + ",/t數量:" + this.num + ",/t合計:" + this.totalPrice()); }}3.3 創建具體的食物
麻辣雞腿漢堡――ChinaHanburm
package com.demo.factory.model.kfc;import com.demo.factory.model.Hamburg;/** * 中國風味的麻辣雞腿漢堡* * @author maofw * */public class ChinaHanburm extends Hamburg{ /** * 構造方法* * @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;/** * 雞翅實現類* * @author maofw * */public class ChinaChickenWings extends ChickenWings{ public ChinaChickenWings(int num) { this.kind = "奧爾良"; this.price = 2.5f; this.num = num; }}薯條――ChinaFrenchFries
package com.demo.factory.model.kfc;import com.demo.factory.model.FrenchFries;/** * 薯條實現類* * @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;/** * 飲料實現類* * @author maofw * */public class ChinaBeverage extends Beverage{ public ChinaBeverage(int num) { this.kind = "可樂"; this.price = 7.0f; this.num = num; }}3.4 建立工廠
創建抽象肯德基工廠――IKfcFactory 生產抽象食物
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{ // 生產漢堡public Hamburg createHamburg(int num); // 生產薯條public FrenchFries createFrenchFries(int num); // 生產雞翅public ChickenWings createChickenWings(int num); // 生產飲料public Beverage createBeverage(int num);}創建具體肯德基工廠――ChinaKfcFactory 生產具體食物
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{ // 生產可樂public Beverage createBeverage(int num) { return new ChinaBeverage(num); } // 生產奧爾良烤雞翅public ChickenWings createChickenWings(int num) { return new ChinaChickenWings(num); } // 生產薯條public FrenchFries createFrenchFries(int num) { return new ChinaFrenchFries(num); } // 生產麻辣風味雞腿漢堡public Hamburg createHamburg(int num) { return new ChinaHanburm(num); }}3.5 創建客戶類――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; // 構造方法將抽象工廠作為參數傳入public Customer(IKfcFactory kfcFactory) { this.kfcFactory = kfcFactory; } /** * 訂購食物*/ // 訂購麻辣雞腿漢堡public float orderHamburg(int num) { // 獲得麻辣雞腿漢堡Hamburg hamburg = kfcFactory.createHamburg(num); // 輸出訂購信息hamburg.printMesage(); // 返回總價return hamburg.totalPrice(); } // 訂購奧爾良烤雞翅public float orderChickenWings(int num) { // 獲得奧爾良烤雞翅ChickenWings chickenWings = kfcFactory.createChickenWings(num); // 輸出訂購信息chickenWings.printMesage(); // 返回總價return chickenWings.totalPrice(); } // 訂購薯條public float orderFrenchFries(int num) { // 獲得薯條FrenchFries frenchFries = kfcFactory.createFrenchFries(num); // 輸出訂購信息frenchFries.printMesage(); // 返回總價return frenchFries.totalPrice(); } // 訂購可樂public float orderBeverage(int num) { // 獲得可樂Beverage beverage = kfcFactory.createBeverage(num); // 輸出訂購信息beverage.printMesage(); // 返回總價return beverage.totalPrice(); }}3.6 故事情節展現
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{ /** * 主應用程序方法* * @param args */ public static void main(String[] args) { /** * 定義一個肯德基(IKfcFactory類型) */ IKfcFactory kfcFactory = new ChinaKfcFactory(); /** * 爸爸和兒子走進肯德基,準備點餐*/ Customer customer = new Customer(kfcFactory); /** * 開始點餐*/ // 一個麻辣雞腿漢堡float hamhurgMoney = customer.orderHamburg(1); // 四個奧爾良烤雞翅float chickenWingsMoney = customer.orderChickenWings(4); // 一包薯條float frenchFriesMoney = customer.orderFrenchFries(1); // 兩杯可樂float beverageMoney = customer.orderBeverage(2); System.out.println("總計:" + (hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney)); }}運行結果:
--麻辣風味漢堡, 單價:14.0, 數量:1, 合計:14.0
--奧爾良風味雞翅, 單價:2.5, 數量:4, 合計:10.0
--普通風味薯條, 單價:8.0, 數量:1, 合計:8.0
--可樂飲料, 單價:7.0, 數量:2, 合計:14.0
總計:46.0
三、該模式的設計原則
1 多用對象組合,少用繼承
2 針對抽象編程,不針對實現編程
3 產品對象通過工廠暴露的方法創建
四、使用場合
1 創建產品家族,相關產品集合在一起使用的時候;
2 想要提供一個產品類庫,並只想顯示其接口而不是實現時;
3 通過組合的方式使用工廠時。
更多關於java算法相關內容感興趣的讀者可查看本站專題:《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。