抽象工厂模式:

  此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类.

解决什么问题:

  抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦.

UML:

  

代码结构:

  

代码:

  定义抽象产品:

package com.demo.factory.model;/*** 抽象产品*/
public abstract class AbstractBaseFood {protected String kind;protected int num;protected float price;public float totalPrice() {return this.num * this.price;}
}

  产品接口:

package com.demo.factory.model;/*** 抽象产品接口*/
public interface IFood {void printMessage();
}

  抽象具体产品-Beverage类:

package com.demo.factory.model;/*** 抽象具体产品-Beverage*/
public abstract class Beverage extends AbstractBaseFood implements IFood{@Overridepublic void printMessage() {System.out.println("--" + this.kind + "饮料, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());}
}

  抽象具体产品-ChickenWings类:

package com.demo.factory.model;/*** 抽象具体产品-ChickenWings*/
public abstract class ChickenWings extends AbstractBaseFood implements IFood {@Overridepublic void printMessage() {System.out.println("--" + this.kind + "风味鸡翅, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());}
}

  抽象具体产品-FrenchFries类:

package com.demo.factory.model;/*** 抽象具体产品-FrenchFries*/
public abstract class FrenchFries extends AbstractBaseFood implements IFood {@Overridepublic void printMessage() {System.out.println("--" + this.kind + "风味薯条, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());}
}

  抽象具体产品-Hamburg类:

package com.demo.factory.model;/*** 抽象具体产品-Hamburg*/
public abstract class Hamburg extends AbstractBaseFood implements IFood {@Overridepublic void printMessage() {System.out.println("--" + this.kind + "风味汉堡, \t 单价: " + this.price + ", .\t 数量: " + this.num + ", \t 合计: " + this.totalPrice());}
}

  具体产品-ChinaBeverage类:

package com.demo.factory.model.kfc;import com.demo.factory.model.Beverage;/*** 具体产品-ChinaBeverage*/
public class ChinaBeverage extends Beverage {public ChinaBeverage(int num) {this.kind = "可乐";this.price = 8.0f;this.num = num;}
}

  具体产品-ChinaChickenWings类:

package com.demo.factory.model.kfc;import com.demo.factory.model.ChickenWings;/*** 具体产品-ChinaChickenWings*/
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;/*** 具体产品-ChinaFrenchFries*/
public class ChinaFrenchFries extends FrenchFries {public ChinaFrenchFries(int num) {this.kind = "普通";this.price = 8.0f;this.num = num;}
}

  具体产品-ChinaHamburg类:

package com.demo.factory.model.kfc;import com.demo.factory.model.Hamburg;/*** 具体产品-ChinaHumburg*/
public class ChinaHamburg extends Hamburg {public ChinaHamburg(int num) {this.kind = "麻辣";this.price = 14.0f;this.num = num;}
}

  抽象工厂接口:

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;/*** 抽象工厂接口*/
public interface IKfcFactory {Hamburg createHamburg(int num);ChickenWings createChickenWings(int num);FrenchFries createFrenchFries(int num);Beverage createBeverage(int num);
}

  实际工厂:

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.ChinaHamburg;/*** 实际工厂*/
public class ChinaKfcFactory implements IKfcFactory {@Overridepublic Hamburg createHamburg(int num) {return new ChinaHamburg(num);}@Overridepublic ChickenWings createChickenWings(int num) {return new ChinaChickenWings(num);}@Overridepublic FrenchFries createFrenchFries(int num) {return new ChinaFrenchFries(num);}@Overridepublic Beverage createBeverage(int num) {return new ChinaBeverage(num);}
}

  客户类:

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;/*** 客户类*/
public class Customer {private IKfcFactory kfcFactory;public Customer(IKfcFactory kfcFactory) {this.kfcFactory = kfcFactory;}public float orderHamburg(int num) {Hamburg hamburg = kfcFactory.createHamburg(num);hamburg.printMessage();return hamburg.totalPrice();}public float orderChickenWings(int num) {ChickenWings chickenWings = kfcFactory.createChickenWings(num);chickenWings.printMessage();return chickenWings.totalPrice();}public float orderFrenchFries(int num) {FrenchFries frenchFries = kfcFactory.createFrenchFries(num);frenchFries.printMessage();return frenchFries.totalPrice();}public float orderBeverage(int num) {Beverage beverage = kfcFactory.createBeverage(num);beverage.printMessage();return beverage.totalPrice();}
}

  

转载于:https://www.cnblogs.com/arctique/p/5747117.html

设计模式那点事读书笔记(2)----抽象工厂模式相关推荐

  1. 【设计模式笔记】抽象工厂模式

    围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂. 提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类. 每个生成的工厂都能按照工厂 ...

  2. 《JavaScript设计模式》笔记 之 抽象工厂模式

    抽象工厂模式 抽象工厂模式:通过对类的工厂抽象使其业务用域对产品类簇的创建,而不是负责创建某一类产品的实例. 抽象类 JavaScript 中 abstract 还是保留字,虽然不像传统面向对象创建, ...

  3. 设计模式笔记之三抽象工厂模式

    抽象工厂模式 为什么引入抽象工厂模式? 一个接口代表一系列操作,当我们需要的对象需要多个接口,而这些接口又是不相干的,同时对于类的创建我们不需要知道具体的实现细节,只需要知道某个特征就可以,虽然工厂方 ...

  4. 设计模式系列一创建型之(抽象工厂模式)

    1.抽象工厂简介 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作. 如何应对这种变化? 如何绕过常规的对象的创建方 ...

  5. 设计模式(6)[JS版]-JavaScript如何实现抽象工厂模式?

    目录 1 学习目标 2 什么是抽象工厂模式? 3 抽象工厂模式作用 4 工厂模式参与者 5 代码实现 1 学习目标 通过本篇文章的学习,你应当掌握以下知识: 1 知道什么是抽象工厂模式? 2 掌握抽象 ...

  6. javascript设计模式(javascript设计模式与开发实践读书笔记)

    javascript设计模式(javascript设计模式与开发实践读书笔记) 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者 ...

  7. 【JavaScript设计模式张容铭】抽象工厂模式深度剖析——关于继承与constructor属性的深度理解

    写在前面 最近阅读了张容铭的<JavaScript设计模式>一书,阅读到抽象工厂模式一节时对书上的代码产生了疑问,但同时在解决疑问的过程中,对继承又产生了新的理解. 我仔细查阅了很多文章, ...

  8. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  9. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  10. CSharp设计模式读书笔记(3):抽象工厂模式(学习难度:★★★★☆,使用频率:★★★★★)...

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽象工厂模式又称为Kit模式. 模式角色和结构图: 抽象工厂是指一 ...

最新文章

  1. 算法---------括号生成
  2. 一年三篇IF大于7的牛人告诉你怎么写SCI
  3. 使用 pv 命令监控 linux 命令的执行进度
  4. 避坑!gulp-imagemin运行出问题
  5. python selenium处理JS只读(12306)
  6. Java继承_java练习本(20190617)
  7. esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
  8. 非文学翻译理论与实践_2019年北京语言大学翻译学专业考研经验分享
  9. 陪同学面试,我竟然被录取了
  10. 操作系统读写者问题实验报告_备战秋招——操作系统(2)
  11. 小云(云层-陈霁)的发展史
  12. 20145202马超《java》实验5
  13. Unity3D之创建3D游戏场景
  14. 美团点评点餐 Nuxt.js 实战
  15. js 改变匹配到的字符串的颜色 — replace
  16. 视频特效如何制作?快把这些方法收好
  17. Android分屏显示
  18. 虚拟动力数字人技术亮相第六届文创产业大会,探见元宇宙 驱动新文创
  19. 验证哥德巴赫猜想:任何一个大于等于6的偶数均可表示为两个素数的和。如6=3+3,8=3+5,,18=5+13。试编写程序,要求将输入的一个偶数表示成两个素数之和。 输入输出样例如下:
  20. iic调试软件上时钟芯片测试,硬件IIC测试成功!!给大家分享一下

热门文章

  1. android启动服务的生命周期,Android Service的两种启动方式以及生命周期
  2. linux 进程间广播,Linux系统编程之进程间通信之浅谈信号
  3. C/C++_Lambda表达式
  4. WebLOAD Open Source 从入门到精通
  5. day23_内置函数(__del__ item系列 ,模块)
  6. 【书籍推荐】《美国黒室》
  7. VMware 虚拟机桥接网络设置
  8. redis java操作
  9. MongoDB学习笔记~官方驱动的原生Curd操作
  10. ubuntu下的jdk环境变量配置(解决sun jdk和open jdk的问题)