类图

抽象披萨商店类

  1. public abstract class PizzaStore {
  2. public void orderPizza(String type) {
  3. AbstractPizza abstractPizza = this.createPizza(type);
  4. abstractPizza.prepare();
  5. abstractPizza.cut();
  6. abstractPizza.bake();
  7. abstractPizza.box();
  8. }
  9. //子类实现
  10. public abstract AbstractPizza createPizza(String type);
  11. }

实体披萨商店

  1. public class ChicagoPizzaStore extends PizzaStore {
  2. public AbstractPizza createPizza(String type) {
  3. AbstractPizza pizza = null;
  4. if ("cheesePizza".equals(type)) {
  5. pizza = new CheeseAbstractPizza();
  6. } else if ("greekPizza".equals(type)) {
  7. pizza = new GreekAbstractPizza();
  8. } else if ("pepperoniPizza".equals(type)) {
  9. pizza = new PepperoniAbstractPizza();
  10. }
  11. return pizza;
  12. }
  13. }
  14. public class NYPizzaStore extends PizzaStore {
  15. public AbstractPizza createPizza(String type) {
  16. AbstractPizza pizza = null;
  17. if ("cheesePizza".equals(type)) {
  18. pizza = new CheeseAbstractPizza();
  19. } else if ("greekPizza".equals(type)) {
  20. pizza = new GreekAbstractPizza();
  21. } else if ("pepperoniPizza".equals(type)) {
  22. pizza = new PepperoniAbstractPizza();
  23. }
  24. return pizza;
  25. }
  26. }

抽象披萨

  1. public abstract class AbstractPizza {
  2. public void prepare() {
  3. System.out.println("prepare pizza");
  4. }
  5. public void bake(){
  6. System.out.println("bake pizza");
  7. }
  8. public void cut(){
  9. System.out.println("cut pizza");
  10. }
  11. public void box(){
  12. System.out.println("pizza box");
  13. }
  14. }

实体披萨

  1. public class CheeseAbstractPizza extends AbstractPizza {
  2. @Override
  3. public void prepare() {
  4. System.out.println("prepare CheesePizza");
  5. }
  6. }
  7. public class GreekAbstractPizza extends AbstractPizza {
  8. @Override
  9. public void prepare() {
  10. System.out.println("prepare GreekPizza");
  11. }
  12. }
  13. public class PepperoniAbstractPizza extends AbstractPizza {
  14. @Override
  15. public void prepare() {
  16. System.out.println("prepare PepperoniPizza");
  17. }
  18. }

运行

  1. public class Tester {
  2. public static void main(String[] args) {
  3. PizzaStore pizzaStore = new NYPizzaStore();
  4. PizzaStore pizzaStore1 = new ChicagoPizzaStore();
  5. System.out.println(pizzaStore.createPizza("greekPizza"));
  6. System.out.println(pizzaStore1.createPizza("pepperoniPizza"));
  7. }
  8. }

总结

  1. 面向接口编程,扩展开放
  2. 父类不需要知道子类的具体实现

HeadFirst设计模式---抽象工厂的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  4. HeadFirst设计模式之工厂模式

    一. 1."工厂模式"不是种真正的设计模式,而是一种编程术语 2.The Factory Method Pattern defi nes an interface for crea ...

  5. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  6. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  7. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  8. C#设计模式——抽象工厂

    一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...

  9. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

随机推荐

  1. git在idea中的冲突解决(非常重要)

    1.什么是冲突 冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致.读起来有点绕,结合下面的案例理解. 从上面对冲突的定义来看,冲突时发生在同一个文件上的. 2.生产上冲突的场景 常见冲突的 ...

  2. 详解TCP与UDP

    一.TCP的特点 面向连接的.可靠的.基于字节流的传输层通信协议. 将应用层的分割成报文段,并发送发给目标节点的TCP层. 数据包都有序号,对方收到则发送ACK确认,未收到则重传. 使用效验和来效验数 ...

  3. Linux--NIS

    一. 环境准备 操作系统:CentOS7.6 服务端安装如下软件: 软件名称 功能 ypserv NIS Server端的服务进程 rpcbind 提供RPC服务 客户端安装如下软件: 软件名称 功能 ...

  4. PyCharm重命名文件时更改引用的地方

    Shift + F6 在文件夹直接更改文件名称时,其它文件里有调用这个模块的话,名称是不会改变的,只会报错,显示找不到这个模块,这时,可以在pycharm里直接更改 右键你需要改名的文件,选择Refa ...

  5. [Go] gocron源码阅读-flag包实现命令行参数获取

    调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...

  6. xml的建模

    xml建模的思路 1.分析需要被建模的文件中有那几个对象 2.每个对象拥有的行为以及属性 3.定义对象从小到大(从里到外) 4.通过23种的设计模式中的工厂模式,解析xml生产出指定对象 建模的好处 ...

  7. 7.2 Spark Streaming

    一.Spark Streaming设计 Spark Streaming可整合多种输入数据源,如Kafka.Flume.HDFS,甚至是普通的TCP套接字.经处理后的数据可存储至文件系统.数据库,或显示 ...

  8. shell的几个实战脚本例子(欠)

    如何让shell实现 可选择性执行 的功能 巡检内存使用率 批量创建用户 场景:公司想要做测试,需要10000个用户 数据库里查询学生成绩 #如何登录mysql数据库 #如何写sql对数据进行操作 # ...

  9. Angular7入门总结篇

  10. SpringCloud微服务常见组件理解

    概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...