专栏首页IT界的泥石流设计模式(九):抽象工厂模

设计模式(九):抽象工厂模

什么是抽象工厂模式

提供一个为创建一组相关或相互依赖对象的接口,且无须指定它们的具体类。

它属于创建型模式。在抽象工厂模式中,每个具体工厂都提供了多个用于创建多种不同类型具体对象的方法,这些不同类型的对象都存在一个共同的属性,构成一个族。

抽象工厂模式的应用场景

上篇文章《设计模式(八):工厂方法模式》说到工厂方法模式中只考虑某一类产品的生产,例如可乐工厂只生产可乐,橙汁工厂只生产橙汁。而实际过程中,一个工厂往往要生产多种类的产品,例如可乐和橙汁一起生产,方便售卖。原有的工厂方法模式不符合实际使用的要求,所以聪明的先辈们又想到了一种新的设计模式——抽象工厂模式。

使用抽象工厂模式一般要满足以下条件。

  • 系统中有多个产品族,每个具体工厂创建同一族不同等级结构的多种产品。
  • 系统一次只可能消费其中某一族产品。

抽象工厂与工厂方法的区别

抽象工厂模式中的工厂保留了工厂方法模式的优秀属性,同时可以创建多种类的产品,而工厂方法模式的工厂只能创建一类产品。

抽象工厂模式的优点:

  • 将具体产品的创建延迟到具体工厂中,从工厂中获取具体产品,减少客户与具体产品的耦合度,有利于系统的维护与拓展
  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 容易增加新的产品族,只需新增新的工厂类和产品类即可 , 符合开放封闭原则

抽象工厂模式的缺点:

拓展同一族的产品困难,需要从抽象层到具体实现中修改代码,违背了开放封闭原则

抽象工厂模式的结构与实现

1、抽象工厂的结构

抽象工厂模式与工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品、具体产品。具体结构如下:

AbstractFactory 为抽象工厂,ProductA 和ProductB 是抽象产品。ConcreteFactoryA和ConcreteFactoryB为具体工厂,ConcreteProductA 和 ConcreteProductB 是具体产品。

2、抽象工厂的实现

我们在上次文章的基础上加以拓展,工厂除了要生产衣服外,还要生产裤子。根据上面我们的描述,这时就适合用抽象工厂模式来实现。我们设计 A 和 B 两个工厂,A 工厂生产短裤和T恤衫,B 工厂生产牛仔裤和 POLO衫。我们对代码作以下调整:

//衣服interface Clothes {  void desc();}//T恤衫class TShirt implements Clothes {  @Override  public void desc() {    System.out.println("I'm TShirt");  }}//Polo衫class PoloShirt implements Clothes {  @Override  public void desc() {    System.out.println("I'm PoloShirt");  }}//裤子interface Trousers {  void desc();}//短裤class Short implements Trousers {  @Override  public void desc() {    System.out.println("I'm Short");  }}//牛仔裤class Jeans implements Trousers {  @Override  public void desc() {    System.out.println("I'm Jeans");  }}  interface IFactory {  Clothes produceClothes();  Trousers produceTrousers();}
class AFactory implements IFactory {  @Override  public Clothes produceClothes() {    Clothes clothes =  new TShirt();    return clothes;  }
  @Override  public Trousers produceTrousers() {    Trousers trousers = new Short();    return trousers;  }}
class BFactory implements IFactory {  @Override  public Clothes produceClothes() {    Clothes clothes =  new PoloShirt();    return clothes;  }
  @Override  public Trousers produceTrousers() {    Trousers trousers = new Jeans();    return trousers;  }}

本文分享自微信公众号 - IT界的泥石流(gh_888495c5eb2c),作者:天狼星

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式(八):工厂方法模式

    定义用于创建对象的接口,让子类决定创建哪个类的实例。工厂方法允许类的实例化延迟到子类。

    xujjj
  • 为什么TCP的连接建立需要三次握手?

    互联网的通信都是遵循着一定的协议的,通信双方必须经过一些约定俗成的协议才能互相通信,不然我说中文,你说英文,两者相互听不懂对方的消息,这样是无法通信的,因此就必...

    xujjj
  • HTTP详解

    爬虫又称网络爬虫,所以在讲解爬虫之前,我们有必要了解一下什么是网络?网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互...

    xujjj
  • 设计模式中工厂方法与抽象工厂之间的区别联系

    个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。 再通俗深化...

    JAVA日知录
  • 设计模式(十三)抽象工厂模式

    前言 此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式。关于这两个模式,不明白的可以查看我的博客:http://liuwan...

    用户1269200
  • 封装工厂类创建BottomNavigationBar的addItem

    ●  工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

    AWeiLoveAndroid
  • 23种设计模式之工厂三兄弟

    关于设计模式,是一个永远说不完的也说不清的话题。毕竟在编程的世界里,没有最好的设计模式,只有最合适的设计模式。甚至有些时候,程序或者问题不到一定的规模,尝试所有...

    VV木公子
  • 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式...

    Dato
  • 工厂方法模式 创建型 设计模式(三)

    核心的工厂角色,不再是具体的工厂,也就是不再负责所有具体产品的创建,进一步转变为抽象角色。

    noteless
  • 设计模式(四):从“兵工厂”中探索简单工厂、工厂方法和抽象工厂模式

    前面陆陆续续的更新了三篇关于设计模式的博客,是关于“策略模式”、“观察者模式”、“装饰者模式”的,今天这篇博客就从“兵工厂”中来探索一下“工厂模式”(Facto...

    lizelu

扫码关注云+社区

领取腾讯云代金券