Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例詳解
本文實(shí)例講述了Java使用抽象工廠模式實(shí)現(xiàn)的肯德基消費(fèi)案例。分享給大家供大家參考,具體如下:
一、模式定義
抽象工廠模式提供了一個(gè)接口,用于創(chuàng)建相關(guān)或者依賴(lài)對(duì)象的家族,而不需要指定具體實(shí)現(xiàn)類(lèi)。
抽象工廠模式允許客戶(hù)使用抽象接口來(lái)創(chuàng)建一組相關(guān)的產(chǎn)品,客戶(hù)類(lèi)和工廠類(lèi)分開(kāi),客戶(hù)需要任何產(chǎn)品的時(shí)候,只需要向工廠請(qǐng)求即可,客戶(hù)無(wú)須修改就可以獲得新產(chǎn)品。
二、模式舉例
1 模式分析
我們借用爸爸和兒子到肯德基店消費(fèi)這一場(chǎng)景來(lái)說(shuō)明這一模式,進(jìn)行抽象分析后的截圖如下

2 抽象工廠模式的靜態(tài)建模

3 代碼示例
3.1 抽象食物的建立
抽象食物——AbstractBaseFood
package com.demo.factory.model;
/**
*
* 食物基類(lèi)
*
* @author maofw
*
*/
public abstract class AbstractBaseFood
{
// 類(lèi)別
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 建立不同食物的抽象基類(lèi)
漢堡基類(lèi)——Hamburg
package com.demo.factory.model;
/**
* 漢堡基類(lèi)
*
* @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());
}
}
雞翅基類(lèi)——ChickenWings
package com.demo.factory.model;
/**
* 雞翅基類(lèi)
*
* @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基類(lèi)——FrenchFries
package com.demo.factory.model;
/**
* 薯?xiàng)l基類(lèi)
*
* @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());
}
}
飲料基類(lèi)——Beverage
package com.demo.factory.model;
/**
* 飲料基類(lèi)
*
* @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)類(lèi)
*
* @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)類(lèi)
*
* @author maofw
*
*/
public class ChinaFrenchFries extends FrenchFries
{
public ChinaFrenchFries(int num)
{
this.kind = "普通";
this.price = 8.0f;
this.num = num;
}
}
可樂(lè)——ChinaBeverage
package com.demo.factory.model.kfc;
import com.demo.factory.model.Beverage;
/**
* 飲料實(shí)現(xiàn)類(lèi)
*
* @author maofw
*
*/
public class ChinaBeverage extends Beverage
{
public ChinaBeverage(int num)
{
this.kind = "可樂(lè)";
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;
/**
* 肯德基抽象工廠基類(lèi)
*
* @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)可樂(lè)
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)建客戶(hù)類(lèi)——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;
/**
* 客戶(hù)類(lèi)
*
* @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)可樂(lè)
public float orderBeverage(int num)
{
// 獲得可樂(lè)
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類(lèi)型)
*/
IKfcFactory kfcFactory = new ChinaKfcFactory();
/**
* 爸爸和兒子走進(jìn)肯德基,準(zhǔn)備點(diǎn)餐
*/
Customer customer = new Customer(kfcFactory);
/**
* 開(kāi)始點(diǎn)餐
*/
// 一個(gè)麻辣雞腿漢堡
float hamhurgMoney = customer.orderHamburg(1);
// 四個(gè)奧爾良烤雞翅
float chickenWingsMoney = customer.orderChickenWings(4);
// 一包薯?xiàng)l
float frenchFriesMoney = customer.orderFrenchFries(1);
// 兩杯可樂(lè)
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
--可樂(lè)飲料, 單價(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ì)象通過(guò)工廠暴露的方法創(chuàng)建
四、使用場(chǎng)合
1 創(chuàng)建產(chǎn)品家族,相關(guān)產(chǎn)品集合在一起使用的時(shí)候;
2 想要提供一個(gè)產(chǎn)品類(lèi)庫(kù),并只想顯示其接口而不是實(shí)現(xiàn)時(shí);
3 通過(guò)組合的方式使用工廠時(shí)。
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Springboot通過(guò)谷歌Kaptcha?組件生成圖形驗(yàn)證碼功能
Kaptcha是谷歌開(kāi)源的一款簡(jiǎn)單實(shí)用的圖形驗(yàn)證碼組件。我個(gè)人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項(xiàng)目中,這篇文章主要介紹了Springboot通過(guò)谷歌Kaptcha組件生成圖形驗(yàn)證碼的方法,需要的朋友可以參考下2023-05-05
一篇文章教你將JAVA的RabbitMQz與SpringBoot整合
這篇文章主要介紹了如何將JAVA的RabbitMQz與SpringBoot整合,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
SSH框架網(wǎng)上商城項(xiàng)目第9戰(zhàn)之添加和更新商品類(lèi)別功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第9戰(zhàn)之添加和更新商品類(lèi)別功能實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2016-06-06
springboot yml配置文件使用@project.xxxx@啟動(dòng)報(bào)錯(cuò)Do not
這篇文章主要介紹了springboot yml配置文件使用@project.xxxx@啟動(dòng)報(bào)錯(cuò)Do not use @ for indentation問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序
HTTP/HTTPS是最常見(jiàn)的協(xié)議套件之一,并且隨著智能手機(jī)的成功,它的應(yīng)用也日益廣泛,因?yàn)閷?duì)于任何公司來(lái)說(shuō),擁有一個(gè)可以被移動(dòng)設(shè)備訪問(wèn)的網(wǎng)站幾乎是必須的。下面就來(lái)看看如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序2021-06-06
換了最新的idea如何將原來(lái)舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中
這篇文章主要介紹了換了最新的idea如何將原來(lái)舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Java實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

