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

概述

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

使用场景

一个产品族有相同的约束时可以使用抽象工厂模式。是不是听起来很抽象?比如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 条评论
登录 后参与评论

相关文章

来自专栏c#开发者

XML Encryption in .Net

XML Encryption in .Net One of the new features being introduced with the Whidbey...

4367
来自专栏码匠的流水账

聊聊spring cloud的HystrixAutoConfiguration

本文主要研究一下spring cloud的HystrixAutoConfiguration

972
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1142
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

5896
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

9744
来自专栏码匠的流水账

聊聊HystrixThreadPool

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java

771
来自专栏Pulsar-V

Save Camera Document

#pragma once #include "HCCamera.h" #include <time.h> #include <cstdio> #incl...

2828
来自专栏码匠的流水账

spring security reactive获取security context

本文主要研究下reactive模式下的spring security context的获取。

1762
来自专栏一个会写诗的程序员的博客

java.sql.SQLException: connection holder is null

java.sql.SQLException: connection holder is null

1341
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

1282

扫码关注云+社区