前言

在前面的章节中,我们先后介绍了简单工厂模式和工厂方法模式。他们都是工厂模式大家族的一员,那么,本章将会接着上一章,来说一说工厂模式的最后一员,那就是抽象工厂模式。

思考题

首先,来思考下下面的问题怎么实现:

在工厂方法模式中,博主在四川和上海开了一家饭店,目前生意相当的火爆,但是还是不赚钱。分析原因发现,目前各家分店都是自己采购原料,并且很贵。那博主就不愿意了,博主决定,自己开一家生产原料的工厂。那么我们应该去实现这个工厂呢?

要是学习了 抽象工厂模式 ,你就会很惊喜的发现,那家伙可以很好的满足我们的需求。

抽象工厂模式

定义:抽象工厂模式就是在抽象工厂中提供一系列的接口,用这一系列的接口创建相关或者依赖对象的家族,而不需要指定具体的类。

类图:

上面的类图,涉及以下几个角色:

  • 抽象产品A,B:为产品A,B定义了一些接口。
  • 具体产品A,B:抽象产品A,B的具体实现。
  • 抽象工厂:定义了一些列的接口,用于创建具体的产品A,B。
  • 具体工厂:实现了抽象工厂的一系列接口,可以生产一些相关的产品。

思考题实现

首先,定义抽象产品:

Salt.java:

public interface Salt {
String put();
}

然后,定义抽象产品的实现:

ShangHaiSalt.java:

public class ShangHaiSalt implements Salt {
public String put() {
return "上海的盐";
}
}

SiChuanSalt.java:

public class SiChuanSalt implements Salt {
public String put(){
return "四川的盐";
}
}

然后,定义抽象原料工厂:

IngredientFactory.java:

public interface IngredientFactory {
Salt createSalt();
}

然后,实现抽象原料工厂:

ShangHaiIngredientFactory.java:

public class ShangHaiIngredientFactory implements IngredientFactory {
public Salt createSalt() {
return new ShangHaiSalt();
}
}

SiChuanIngredientFactory.java:

public class SiChuanIngredientFactory implements IngredientFactory {
public Salt createSalt() {
return new SiChuanSalt();
}
}

然后,定义抽象产品:

Food.java:

public abstract class Food {
protected IngredientFactory ingredientFactory; public Food(IngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
} public void fry() {
System.out.println("翻炒");
} public void eat() {
System.out.println("吃");
} public abstract void putSeasoning();
}

然后,实现抽象产品:

KungPaoChicken.java:

public class KungPaoChicken extends Food {
public KungPaoChicken(IngredientFactory ingredient) {
super(ingredient);
} @Override
public void putSeasoning() {
Salt salt = ingredientFactory.createSalt();
System.out.println("放入" + salt.put());
}
}

TomatoEgg.java:

public class TomatoEgg extends Food {

    public TomatoEgg(IngredientFactory ingredientFactory) {
super(ingredientFactory);
}
@Override
public void putSeasoning() {
Salt salt = ingredientFactory.createSalt();
System.out.println("放入" + salt.put());
}
}

然后,定义抽象工厂:

AbstractHotal.java:

public abstract class AbstractHotal {
public Food saleFood(String foodName) {
Food food = createFood(foodName);
food.putSeasoning();
food.fry();
return food;
} public abstract Food createFood(String foodName);
}

然后,实现抽象工厂:

ShangHaiHotal.java:

public class ShangHaiHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
IngredientFactory ingredient = new ShangHaiIngredientFactory();
switch(foodName) {
case "KungPaoChicken":
return new KungPaoChicken(ingredient);
case "TomatoEgg":
return new TomatoEgg(ingredient);
default:
return null;
}
}
}

SiChuanHotal.java:

public class SiChuanHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
IngredientFactory ingredient = new SiChuanIngredientFactory();
switch(foodName) {
case "KungPaoChicken":
return new KungPaoChicken(ingredient);
case "TomatoEgg":
return new TomatoEgg(ingredient);
default:
return null;
}
}
}

最后附上测试代码:

Custom.java:

public class Custom {
public static void main(String ...args) {
AbstractHotal shangHaiHotal = new ShangHaiHotal();
AbstractHotal siChuanHotal = new SiChuanHotal(); Food shangHaiKungPaoChicken = shangHaiHotal.saleFood("KungPaoChicken");
Food shangHaiTomatoEgg = shangHaiHotal.saleFood("TomatoEgg"); Food siChuanKungPaoChicken = siChuanHotal.saleFood("KungPaoChicken");
Food siChuanTomatoEgg = siChuanHotal.saleFood("TomatoEgg"); shangHaiKungPaoChicken.eat();
shangHaiTomatoEgg.eat(); siChuanKungPaoChicken.eat();
siChuanTomatoEgg.eat();
}
}

[design pattern](6) Absract Factory的更多相关文章

  1. [design pattern](4) SImple Factory

    前言 本博客主要介绍简单工厂模式(Simple Factory),简单工厂模式是创建型模式的一员,也是我们平时coding用到的比较多的一个模式了. 思考题 首先,让我们思考以下的需求: 博主,突然很 ...

  2. [Design Pattern] Factory Pattern 简单案例

    Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...

  3. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  4. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  5. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  6. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  7. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  8. C++ Design Pattern: What is a Design Pattern?

    Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when deve ...

  9. Design Pattern in Simple Examples

    Instead of defining what is design pattern lets define what we mean by design and what we mean by pa ...

随机推荐

  1. Atomic实现原子性源码分析:CAS(比较并交换)、Unsafe类

    1.CAS: 比较并交换(Compare And Swap),是Unsafe类中的一条CPU系统原语,原语的执行必须是连续的,在执行过程中不允许被中断,即CAS是一条CPU的原子指令,不会造成数据不一 ...

  2. 剑指offer-顺时针打印矩阵-数组-python

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  3. OCR(光学字符识别)技术简介

    OCR技术起源 OCR最早的概念是由德国人Tausheck最先提出的,1966年他们发表了第一篇关于汉字识别的文章,采用了模板匹配法识别了1000个印刷体汉字.早在60.70年代,世界各国就开始有OC ...

  4. springboot中model,modelandview,modelmap的区别与联系

    springboot 中Model,ModelAndView,ModelMap的区别与联系 Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类 public c ...

  5. knative 安装

    knative 安装 本文安装版本 knative 0.6. 准备 安装 knative 前需要事先安装 Kubernetes 集群 和 Istio. 安装 下载安装所需要的文件.以下选择的是全安装, ...

  6. js变量的作用域与函数作用域

    引自 1. 变量的作用域(var与let的区别) 在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问.在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问. E ...

  7. Flask开发系列之快速入门

    Flask开发系列之快速入门 文档 一个最小的应用 调试模式 路由 变量规则 构造 URL HTTP 方法 静态文件 模板渲染 访问请求数据 环境局部变量 请求对象 文件上传 Cookies 重定向和 ...

  8. window环境下,php+sphinx+coreseek实现简单的中文全文搜索

    就以我个人理解来说,sphinx其实是介于客户端和mysql之间的一个索引表,把数据库的没一条记录假设为文档,那么这个索引表其实保存的就是这条记录的关键词及其对应的文档id 1.sphinx的安装 下 ...

  9. 安装与学习laravel

    安装 composer cd /var/www/html curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/ ...

  10. tomcat+redis接上篇

    数据库允许远程连接 把数据库中的mysql数据库中的user表里的host项为localhost的改为 % update user set host = '%' where user = 'root' ...