HeadFirst设计模式---抽象工厂
类图

抽象披萨商店类
public abstract class PizzaStore {
public void orderPizza(String type) {
AbstractPizza abstractPizza = this.createPizza(type);
abstractPizza.prepare();
abstractPizza.cut();
abstractPizza.bake();
abstractPizza.box();
}
//子类实现
public abstract AbstractPizza createPizza(String type);
}
实体披萨商店
public class ChicagoPizzaStore extends PizzaStore {
public AbstractPizza createPizza(String type) {
AbstractPizza pizza = null;
if ("cheesePizza".equals(type)) {
pizza = new CheeseAbstractPizza();
} else if ("greekPizza".equals(type)) {
pizza = new GreekAbstractPizza();
} else if ("pepperoniPizza".equals(type)) {
pizza = new PepperoniAbstractPizza();
}
return pizza;
}
}
public class NYPizzaStore extends PizzaStore {
public AbstractPizza createPizza(String type) {
AbstractPizza pizza = null;
if ("cheesePizza".equals(type)) {
pizza = new CheeseAbstractPizza();
} else if ("greekPizza".equals(type)) {
pizza = new GreekAbstractPizza();
} else if ("pepperoniPizza".equals(type)) {
pizza = new PepperoniAbstractPizza();
}
return pizza;
}
}
抽象披萨
public abstract class AbstractPizza {
public void prepare() {
System.out.println("prepare pizza");
}
public void bake(){
System.out.println("bake pizza");
}
public void cut(){
System.out.println("cut pizza");
}
public void box(){
System.out.println("pizza box");
}
}
实体披萨
public class CheeseAbstractPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("prepare CheesePizza");
}
}
public class GreekAbstractPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("prepare GreekPizza");
}
}
public class PepperoniAbstractPizza extends AbstractPizza {
@Override
public void prepare() {
System.out.println("prepare PepperoniPizza");
}
}
运行
public class Tester {
public static void main(String[] args) {
PizzaStore pizzaStore = new NYPizzaStore();
PizzaStore pizzaStore1 = new ChicagoPizzaStore();
System.out.println(pizzaStore.createPizza("greekPizza"));
System.out.println(pizzaStore1.createPizza("pepperoniPizza"));
}
}
总结
- 面向接口编程,扩展开放
- 父类不需要知道子类的具体实现
HeadFirst设计模式---抽象工厂的更多相关文章
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--抽象工厂
linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢 ...
- HeadFirst设计模式之工厂模式
一. 1."工厂模式"不是种真正的设计模式,而是一种编程术语 2.The Factory Method Pattern defi nes an interface for crea ...
- 设计模式——抽象工厂(Abstract Factory)
Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里 - - ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- 深入浅出设计模式——抽象工厂模式(Abstract Factory)
模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...
- C#设计模式——抽象工厂
一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...
- 24种设计模式--抽象工厂模式【Abstract Factory Pattern】
女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...
随机推荐
- 5个 JS 解构有趣的用途
摘要: 玩转ES6解构赋值. 原文:5个 JS 解构有趣的用途 译者:前端小智 1. 交换变量 通常交换两个变量的方法需要一个额外的临时变量,来看看例子: let a = 1; let b = 2; ...
- ansible错误ImportError: No module named ansible.runner记录
按着官网提供的安装ansible To configure the PPA on your machine and install ansible run these commands: $ sudo ...
- vue全局路由守卫beforeEach+token验证+node
在后端安装jsonwebtoken npm i jsonwebtoken --save 在 login.js文件中引入 // 引入jwtconst jwt = require ...
- 并发编程学习笔记(七、Thread源码分析)
目录: 常见属性 构造函数 start() run() 常见属性: /** * 线程名称 */ private volatile String name; /** * 线程优先级 */ private ...
- 【第1题】 Pythonn内存管理以及垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
- Nginx 安装与部署配置
下载 官方网站:https://nginx.org/en/download.html Windows下安装 安装 下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放 ...
- ORB-SLAM2 地图保存
一.简介 在ORB-SLAM2的System.h文件中,有这样一句话:// TODO: Save/Load functions,让读者自己实现地图的保存与加载功能.其实在应用过程中很多场合同样需要先保 ...
- Sharding-JDBC:查询量大如何优化?
主人公小王入职了一家刚起步的创业公司,公司正在研发一款App.为了快速开发出能够投入市场进行宣传的版本,小王可是天天加班到很晚,忙了一段时间后终于把第一个版本赶出来了. 初期功能不多,表也不多,用的M ...
- vulnhub之GoldenEye-v1靶机
靶机:virtualbox 自动获取 攻击:kali linux 自动获取 设置同一张网卡开启dhcp ifconfig攻击IP是那个网段(也可以netdiscpver,不过毕竟是自己玩懒得等 ...
- STS 创建 Maven 项目填坑
用 STS 创建 Maven 项目并不复杂,只是其中有一些坑在里面,我在解决这些坑的时候发现很多人都遇到了相同的问题,因此把创建的步骤记录在这里.所有的步骤不外乎就是一些套路,并没有什么复杂的地方,只 ...