Java使用抽象工廠模式實現(xiàn)的肯德基消費案例詳解
本文實例講述了Java使用抽象工廠模式實現(xiàn)的肯德基消費案例。分享給大家供大家參考,具體如下:
一、模式定義
抽象工廠模式提供了一個接口,用于創(chuàng)建相關(guān)或者依賴對象的家族,而不需要指定具體實現(xiàn)類。
抽象工廠模式允許客戶使用抽象接口來創(chuàng)建一組相關(guān)的產(chǎn)品,客戶類和工廠類分開,客戶需要任何產(chǎn)品的時候,只需要向工廠請求即可,客戶無須修改就可以獲得新產(chǎn)品。
二、模式舉例
1 模式分析
我們借用爸爸和兒子到肯德基店消費這一場景來說明這一模式,進(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;
// 價格
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 + "風(fēng)味漢堡,\t單價:" + this.price + ",\t數(shù)量:" + 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 + "風(fēng)味雞翅,\t單價:" + this.price + ",\t數(shù)量:" + 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 + "風(fēng)味薯條,\t單價:" + this.price + ",\t數(shù)量:" + 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數(shù)量:" + this.num + ",\t合計:" + this.totalPrice());
}
}
3.3 創(chuàng)建具體的食物
麻辣雞腿漢堡——ChinaHanburm
package com.demo.factory.model.kfc;
import com.demo.factory.model.Hamburg;
/**
* 中國風(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;
/**
* 雞翅實現(xiàn)類
*
* @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;
/**
* 薯條實現(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;
/**
* 飲料實現(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)薯條
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)薯條
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;
}
/**
* 訂購食物
*/
// 訂購麻辣雞腿漢堡
public float orderHamburg(int num)
{
// 獲得麻辣雞腿漢堡
Hamburg hamburg = kfcFactory.createHamburg(num);
// 輸出訂購信息
hamburg.printMesage();
// 返回總價
return hamburg.totalPrice();
}
// 訂購?qiáng)W爾良烤雞翅
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 故事情節(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)
{
/**
* 定義一個肯德基(IKfcFactory類型)
*/
IKfcFactory kfcFactory = new ChinaKfcFactory();
/**
* 爸爸和兒子走進(jìn)肯德基,準(zhǔn)備點餐
*/
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));
}
}
運行結(jié)果:
--麻辣風(fēng)味漢堡, 單價:14.0, 數(shù)量:1, 合計:14.0
--奧爾良風(fēng)味雞翅, 單價:2.5, 數(shù)量:4, 合計:10.0
--普通風(fēng)味薯條, 單價:8.0, 數(shù)量:1, 合計:8.0
--可樂飲料, 單價:7.0, 數(shù)量:2, 合計:14.0
總計:46.0
三、該模式的設(shè)計原則
1 多用對象組合,少用繼承
2 針對抽象編程,不針對實現(xiàn)編程
3 產(chǎn)品對象通過工廠暴露的方法創(chuàng)建
四、使用場合
1 創(chuàng)建產(chǎn)品家族,相關(guān)產(chǎn)品集合在一起使用的時候;
2 想要提供一個產(chǎn)品類庫,并只想顯示其接口而不是實現(xiàn)時;
3 通過組合的方式使用工廠時。
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
jbuilder2006連接sqlserver2000的方法
xp jbuiler2006 連接SQL SERVER2000的問題2008-10-10
JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù)
這篇文章主要為大家介紹了JavaWeb?Listener?利用Session統(tǒng)計在線人數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Java實現(xiàn)將枚舉類轉(zhuǎn)為json并返回給前端
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)將枚舉類轉(zhuǎn)為json并返回給前端的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Java開發(fā)實例之圖書管理系統(tǒng)的實現(xiàn)
圖書管理的功能大體包括:增加書籍、借閱書籍、刪除書籍、查看書籍列表、退出系統(tǒng)、查找書籍、返還書籍這些,本文主要給大家介紹該系統(tǒng)的數(shù)據(jù)庫語句,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作
這篇文章主要介紹了SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10
java 服務(wù)器接口快速開發(fā)之servlet詳細(xì)教程
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務(wù)程序或服務(wù)連接器,用Java編寫的服務(wù)器端程序,具有獨立于平臺和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動態(tài)Web內(nèi)容2021-06-06
JDK自帶的序列化方式優(yōu)缺點及實現(xiàn)原理面試精講
這篇文章主要為大家介紹了JDK自帶的序列化方式優(yōu)缺點及實現(xiàn)原理面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

