前言

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

思考题

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

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

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

抽象工厂模式

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

类图:

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

  • 抽象产品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. Go语言基本数据类型(四)

    Go语言基本数据类型主要包含:bool,number,string 布尔类型 go中的布尔类型,只能是 true 和 false,例如:var b bool = true 数字类型 整型 类型 描述 ...

  2. Linux免密登陆设置了免密登陆为啥还需要输入密码

    一.设置了免密码登陆但是还是需要输入密码: 权限保证:1.authorized-keys 的权限为 600 2.home.账户所在的目录如hadoop..ssh这三个文件的权限都必须设置为700,缺少 ...

  3. HDUST-1245 Interpreter(模拟)

    1245: Problem E: Interpreter 时间限制: 1 Sec  内存限制: 128 MB提交: 4  解决: 2[提交][状态][讨论版] 题目描述 Problem E: Inte ...

  4. Scala学习笔记(3)

    数组 ----------------------------------- 0.若长度固定则用Array,若长度可能变化则使用ArrayBuffer 1.提供初始值的时候不要使用new. 2.用() ...

  5. linux打印彩色输出

    在终端生成彩色输出,我们可以使用转义序列来实现. 每种颜色都有对应的颜色码.比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37 要打印彩色文 ...

  6. centos7.2 my.cnf 更改问题

    MySQL与Python交互,踩坑无数,碰到最棘手的问题就是更改:my.cnf文件,记录下来! 安装虚拟机,碰到下载的镜像文件有缺失,一开始没注意,浪费了很多时间.重新下载,安装成功. 安装MySQL ...

  7. GitHub上一些有趣的开源项目[持续更新]

    TheAlgorithms/C-Plus-Plus 用C++实现了常见的算法,如排序算法,查找算法,以及一些常见的数据数据结构,如链表,二叉树. 链接:https://github.com/TheAl ...

  8. Laravel5.5去除URL中的index.php生成优雅链接

    在使用Apache情况下: Laravel 框架通过 public/.htaccess 文件来让网址中不需要 index.php.如果你的服务器是使用 Apache ,请确认是否有开启 mod_rew ...

  9. JavaScript精进篇

    JavaScript是所有前端框架中最基础的框架,在工作了两年以后又重新回到了这里.过去两年里用的最多的前端框架是jquery,因为它简单易上手,而jquery就是封装了JavaScript.重新系统 ...

  10. Tomcat网站上的core和deployer的区别

    8.5.13 Please see the README file for packaging information. It explains what every distribution(分布) ...