设计模式二十四章经之抽象工厂模式

概述

前面我们已经说到了工厂模式,现在我们扯扯抽象工厂模式。从字母意思理解下,工厂也就是会生产指定的产品。那么抽象工厂就意味着生产出来的产品不是指定的。往简单点说,抽象工厂就是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指明他们的具体类。

使用场景

一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如android、ios下都有短信软件和拨号软件,两者同属于软件。但是,他们所在的系统不一样,即使是同一家公司出品的软件,代码实现也是不一样的。这个时候就可以考虑使用抽象工厂模式来产生这些软件。

具体实现

首先,我们创建一个实体类的接口:

public interface Shape {
   void draw();
}

现在我们创建2个实体类去实现这个接口:

public class Square implements Shape {
   @Override
   public void draw() {
      System.out.println("Square:draw() method.");
   }
}
public class Circle implements Shape {
   @Override
   public void draw() {
      System.out.println("Circle:draw() method.");
   }
}

我们在创建一个实体类的接口:

public interface Color{
  void fill();
}

我们继续创建2个实体类去实现这个接口:

public class RedColor implements Color{
  @Override
  public void fill(){
      System.out.println("Color:Red");
  }
}
public class BlueColor implements Color{
  @Override
  public void fill(){
      System.out.println("Color:Blue");
  }
}

现在我们创建一个工厂类:

public abstract class Factory{
  public abstract Shape createShape();
  public abstract Color createColor();
}

接着我们创建2个工厂去实现这个工厂类:

public class RedSquareFactory extends Factory{
  @Override
  public Shape createShape(){
      return new Square();
  }
  @Override
  public Color createColor(){
      return new RedColor();
  }
}
public class BlueCircleFactory extends Factory{
  @Override
  public Shape createShape(){
      return new Circle();
  }
  @Override
  public Color createColor(){
      return new BlueColor();
  }
}

最后我们来写个demo:

public class Demo{
  public static void main(String[] args){
    Factory redSquareFactory=new RedSquareFactory();
    redSquareFactory.createShape().draw();
    redSquareFactory.createColor().fill();
    Factory blueCircleFactory=new BlueCircleFactory();
    blueCircleFactory.createShape().draw();
    blueCircleFactory.createColor().fill();
  }
}

输出结果如下:

Square:draw() method.
Color:Red
Circle:draw() method.
Color:Blue

总结

优点:

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2018-05-15

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醒者呆

精雕细琢——全方位解析工厂模式

工厂模式是面向对象设计模式中非常重要,非常流行的模式,是应该首先被理解透彻的模式。 我们讲对象的相关职责包括: 对象本身的职责(数据和行为) 创建对象的职责 使...

2886
来自专栏web编程技术分享

JavaScript: 零基础轻松学闭包(1)

1955
来自专栏Java与Android技术栈

为了程序的健壮性,我们可以使用空对象模式

在写代码的时候我们经常会遇到空指针,为了避免空指针的发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。这个时候我就无比怀念groovy、kotlin...

1032
来自专栏拭心的安卓进阶之路

Java 基础巩固:再谈抽象类和接口

文章出自:安卓进阶学习指南 主要贡献者: Milo Struggle shixinzhang 背景介绍 ? 大家好,这篇文章是 《安卓进阶技能树计划》 的...

20610
来自专栏飞雪无情的博客

编写高效的Android代码

毫无疑问,基于Android平台的设备一定是嵌入式设备。现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远...

1003
来自专栏北京马哥教育

让你的Python代码更加pythonic

何为pythonic? pythonic如果翻译成中文的话就是很python。很+名词结构的用法在中国不少,比如:很娘,很国足,很CCTV等等。 我的理解为...

1974
来自专栏醒者呆

零件组装技术——建造者模式深度解析

建造者模式是最后一个创建型设计模式,也是研究对象的创建。 将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。 创建和表示是什么意思...

37110
来自专栏Danny的专栏

数据脱敏——基于Java自定义注解实现日志字段脱敏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

6211
来自专栏HappenLee的技术杂谈

C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

上面这段代码是可以通过编译运行的,可能有些小伙伴会比较困惑,为虾米这里printA函数明明需要接受的是一个A类型,但是传入的一个int类型仍然能够编译通过。

802
来自专栏小詹同学

Leetcode打卡 | No.017 电话号码的字母组合

欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!

1333

扫码关注云+社区