Loading... # 设计模式(一)——简单工厂模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为简单工厂模式 - 简单工厂模式的实质是由一个工厂类根据传入参数的不同,动态决定应该创建哪一个实例。 ## 用简单工厂模式,实现商场促销。 商场促销活动,可能要打不同的折扣,或者满减优惠。 ``` /** * 现金收费抽象类 */ public interface CashSuper { double acceptCash(double money); } ``` ``` /** * 正常收费子类 */ public class CashNormal implements CashSuper{ /** * 正常收费,原价返回 * @param money * @return */ @Override public double acceptCash(double money) { return money; } } ``` ``` /** * 打折收费子类 */ public class CashRebate implements CashSuper { private double moneyRebate = 1d; /** * 初始化时传入打折倍率 * @param moneyRebate */ public CashRebate(String moneyRebate) { this.moneyRebate = Double.valueOf(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } } ``` ``` /** * 返利收费子类 */ public class CashReturn implements CashSuper { //返利条件 private double moneyCondition = 0.0d; //返利值,如满300反100 private double moneyReturn = 0.0d; public CashReturn(String moneyCondition, String moneyRetuen) { this.moneyCondition = Double.valueOf(moneyCondition); this.moneyReturn = Double.valueOf(moneyRetuen); } @Override public double acceptCash(double money) { if (money >= moneyCondition) { money = money - Math.floor(money / moneyCondition) * moneyReturn; } return money; } } ``` ``` /** * 现金收费工厂类 */ public class CashFactory { public static CashSuper createCashAccept(String type){ CashSuper cs = null; switch (type){ case "正常收费": cs = new CashNormal(); break; case "满300返100": cs = new CashReturn("300","100"); break; case "打8折": cs = new CashRebate("0.8"); break; } return cs; } } ``` ``` /** * 客户端程序 */ public class MainClass { enum CbxType { NORMAL("正常收费"), REBATE("打8折"), RETURN("满300返100"); String type = ""; CbxType(String type) { this.type = type; } } public static void main(String[] args) { CashSuper cs = CashFactory.createCashAccept(CbxType.RETURN.type); double price = 100d; double total = 10d; System.out.println(cs.acceptCash(price * total)); } } ``` 客户单程序根据createCashAccept()方法传入参数不同,返回CashSuper的不同子类,调用他们的acceptCash()方法,以实现不同的优惠。 Last modification:June 11th, 2020 at 06:28 pm © 允许规范转载
以小见大,从平凡事物中提炼普世价值。
哈哈哈,写的太好了https://www.lawjida.com/
看的我热血沸腾啊www.jiwenlaw.com