前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(九):抽象工厂模

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

作者头像
xujjj
发布2019-07-22 08:10:58
3540
发布2019-07-22 08:10:58
举报
文章被收录于专栏:IT界的泥石流

什么是抽象工厂模式

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

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

抽象工厂模式的应用场景

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

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

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

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

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

抽象工厂模式的优点:

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

抽象工厂模式的缺点:

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

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

1、抽象工厂的结构

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

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

2、抽象工厂的实现

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

代码语言:javascript
复制
//衣服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;  }}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的泥石流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档