深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)

本文主要是介绍深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有关抽象工厂文章可先看:http://quicker.iteye.com/blog/575183

http://quicker.iteye.com/blog/607944 中我们使用工厂方法给不同地区的比萨店生产出相应口味的比萨。不过当时我们考虑的各个店同一种比萨的口味和用来生产的原料是一样的。比如纽约的芝士比萨和北京的芝士比萨口味与生产所用原料是一样的 。

但是实际上各个地域不同,同一名称的比萨,口味可能不同,生产的原料也可能不同。

于是公司总部决定自己建立一个原料生产基础,给不同地域的比萨加盟店运送相应的原料。

好了,结合http://quicker.iteye.com/blog/575183中电脑的生产示例,生产的都是电脑,生产电脑都要用到CPU和RAM,但是在中国生产的电脑可能用的是龙芯,RAM也是自己的品牌,而在美国用的CPU和RAM就不是同一种。但不管怎么样他们最终都将用来生产各自的电脑,只不过使用的原料不一样。。

 

正确的理解应是:所有的产品都使用相同的组件制造而成,但是每个区域的这些组件都有不同的实现

在比萨店的示例里面,我们使用了工厂方法。

但是我们不难发现:Pizza,NYCheesePizza,ChicagoCheesePizza这几个类实际上是相似的。他们的区别只是不同地域的pizza所使用的原料不同,那么我们就利用抽象工厂来实现。。

 

抽象工厂定义:抽象工厂提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

具体实现:

原料类:

package com.lwf.disign.learn.abstractfactory.cheese;public interface Cheese {}package com.lwf.disign.learn.abstractfactory.cheese;public class ChicagoCheese implements Cheese {}package com.lwf.disign.learn.abstractfactory.cheese;public class NYCheese implements Cheese {}

 

 

package com.lwf.disign.learn.abstractfactory.daugh;public interface Dough {}package com.lwf.disign.learn.abstractfactory.daugh;public class NYDough implements Dough {}package com.lwf.disign.learn.abstractfactory.daugh;public class ChicagoDough implements Dough {}

 

package com.lwf.disign.learn.abstractfactory.sauce;public interface Sauce {}package com.lwf.disign.learn.abstractfactory.sauce;public class NYSauce implements Sauce{}package com.lwf.disign.learn.abstractfactory.sauce;public class ChicagoSauce implements Sauce{}

 

原料工厂类:

package com.lwf.disign.learn.abstractfactory.ingreditfactory;import com.lwf.disign.learn.abstractfactory.cheese.Cheese;
import com.lwf.disign.learn.abstractfactory.daugh.Dough;
import com.lwf.disign.learn.abstractfactory.sauce.Sauce;public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();public Cheese createCheese();
}

 

package com.lwf.disign.learn.abstractfactory.ingreditfactory;import com.lwf.disign.learn.abstractfactory.cheese.Cheese;
import com.lwf.disign.learn.abstractfactory.cheese.NYCheese;
import com.lwf.disign.learn.abstractfactory.daugh.Dough;
import com.lwf.disign.learn.abstractfactory.daugh.NYDough;
import com.lwf.disign.learn.abstractfactory.sauce.NYSauce;
import com.lwf.disign.learn.abstractfactory.sauce.Sauce;public class NYPizzaIngredientFactory implements PizzaIngredientFactory {public Cheese createCheese() {return new NYCheese();}public Dough createDough() {return new NYDough();}public Sauce createSauce() {return new NYSauce();}}

 

 

package com.lwf.disign.learn.abstractfactory.ingreditfactory;import com.lwf.disign.learn.abstractfactory.cheese.Cheese;
import com.lwf.disign.learn.abstractfactory.cheese.ChicagoCheese;
import com.lwf.disign.learn.abstractfactory.daugh.ChicagoDough;
import com.lwf.disign.learn.abstractfactory.daugh.Dough;
import com.lwf.disign.learn.abstractfactory.sauce.ChicagoSauce;
import com.lwf.disign.learn.abstractfactory.sauce.Sauce;public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {public Cheese createCheese() {return new ChicagoCheese();}public Dough createDough() {return new ChicagoDough();}public Sauce createSauce() {return new ChicagoSauce();}}

 

 

Pizza类:

package com.lwf.disign.learn.abstractfactory.pizza;import com.lwf.disign.learn.abstractfactory.cheese.Cheese;
import com.lwf.disign.learn.abstractfactory.daugh.Dough;
import com.lwf.disign.learn.abstractfactory.sauce.Sauce;public abstract class Pizza {String name;	//名称Dough dough;	//面团类型Sauce sauce;	//酱料类型Cheese cheese;public abstract void prepare();public void bake() {System.out.println("Bake for 25 minutes at 350");}public void cut() {System.out.println("Cutting the pizza into diagonal slices");}public void box() {System.out.println("Pizza in offical PizzaStrore box");}public String getName(){return name;}
}

 

 

package com.lwf.disign.learn.abstractfactory.pizza;import com.lwf.disign.learn.abstractfactory.ingreditfactory.PizzaIngredientFactory;public class CheesePizza extends Pizza {private PizzaIngredientFactory pizzaIngredientFactory;public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory){this.pizzaIngredientFactory = pizzaIngredientFactory;}public void prepare(){dough = pizzaIngredientFactory.createDough();sauce = pizzaIngredientFactory.createSauce();cheese =pizzaIngredientFactory.createCheese();}public void cut(){System.out.println("cut it into CheesePizza slices");}
}

 

 

package com.lwf.disign.learn.abstractfactory.pizza;import com.lwf.disign.learn.abstractfactory.ingreditfactory.PizzaIngredientFactory;public class VegglePizza extends Pizza {private PizzaIngredientFactory pizzaIngredientFactory;public VegglePizza(PizzaIngredientFactory pizzaIngredientFactory){this.pizzaIngredientFactory = pizzaIngredientFactory;}public void prepare(){dough = pizzaIngredientFactory.createDough();sauce = pizzaIngredientFactory.createSauce();cheese =pizzaIngredientFactory.createCheese();}public void cut(){System.out.println("cut it into VegglePizza slices");}}

 

 

PizzaStore类:

package com.lwf.disign.learn.abstractfactory.pzstore;import com.lwf.disign.learn.abstractfactory.pizza.Pizza;public abstract class PizzaStore {public final Pizza orderPizza(String type){Pizza pizza;pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}abstract Pizza createPizza(String type);
}

 

package com.lwf.disign.learn.abstractfactory.pzstore;import com.lwf.disign.learn.abstractfactory.ingreditfactory.NYPizzaIngredientFactory;
import com.lwf.disign.learn.abstractfactory.ingreditfactory.PizzaIngredientFactory;
import com.lwf.disign.learn.abstractfactory.pizza.CheesePizza;
import com.lwf.disign.learn.abstractfactory.pizza.Pizza;
import com.lwf.disign.learn.abstractfactory.pizza.VegglePizza;public class NYPizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();if(type.equals("cheese")){pizza = new CheesePizza(pizzaIngredientFactory);}else if(type.equals("veggle")){pizza = new VegglePizza(pizzaIngredientFactory);}return pizza;}}

 

package com.lwf.disign.learn.abstractfactory.pzstore;import com.lwf.disign.learn.abstractfactory.ingreditfactory.ChicagoPizzaIngredientFactory;
import com.lwf.disign.learn.abstractfactory.pizza.CheesePizza;
import com.lwf.disign.learn.abstractfactory.pizza.Pizza;
import com.lwf.disign.learn.abstractfactory.pizza.VegglePizza;public class ChicagoPizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;ChicagoPizzaIngredientFactory chicagoPizzaIngredientFactory = new ChicagoPizzaIngredientFactory();if(type.equals("cheese")){pizza = new CheesePizza(chicagoPizzaIngredientFactory);}else if(type.equals("veggle")){pizza = new VegglePizza(chicagoPizzaIngredientFactory);}return pizza;}}

 

测试类:

package com.lwf.disign.learn.abstractfactory.pzstore;import com.lwf.disign.learn.abstractfactory.pizza.Pizza;public class PizzaStoreTest {public static void main(String[] args) {PizzaStore pizzaStore = new NYPizzaStore();Pizza pizza = pizzaStore.orderPizza("cheese");print(pizza.getName());pizza = pizzaStore.orderPizza("veggle");print(pizza.getName());pizzaStore = new ChicagoPizzaStore();pizza = pizzaStore.orderPizza("cheese");print(pizza.getName());pizza = pizzaStore.orderPizza("veggle");print(pizza.getName());}public static void print(String name){System.out.println(name);System.out.println("-------------------------------------------------------------");}
}

 

 我们再看看抽象工厂的UML图。

看看pizzastore的抽象工厂图。

 

我们使用了工厂方法与抽象工厂实现了比萨店。

那么工厂方法与抽象工厂有什么区别呢。

他们都用来创建对象,工厂方法使用继承;而抽象工厂则使用对象组合。这意味着使用工厂方法就要扩展一个类,并覆盖它的工厂方法。

 

工厂方法只负责将客户从具体类型中解藕。

当你需要创建产品家族和想让制造的相关产品集合起来时,你可以使用抽象工厂。

如果你目前还不知道将来需要实例化哪些具体类时,你可以使用工厂方法。

这篇关于深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434117

相关文章

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C