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

概述

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

使用场景

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

相关文章

来自专栏Java开发

Intellij IDEA 安装lombok及使用详解

  项目中经常使用bean,entity等类,绝大部分数据类类中都需要get、set、toString、equals和hashCode方法,虽然eclipse和...

692
来自专栏Java成长之路

动态代理详解

代理 是常用的基本设计模式之一,在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户...

611
来自专栏SpringBoot

java遍历List的三种方法

391
来自专栏非著名程序员

常见面试题六之java系列

做Android开发最重要的是要有一个很好的java基础。所以在我们的面试过程中也会被经常问到有关java的问题,其实在小编看来,如果java基础不好,那开发起...

1756
来自专栏闻道于事

SpringMVC 常用注解

1、@Controller      @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理...

2656
来自专栏微信公众号:Java团长

Java多态性理解

多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象。

763
来自专栏Java爬坑系列

【Java入门提高篇】Day18 Java容器类详解(一)Collection接口

  所谓容器,就是专门用来装对象的东西,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体,但是集合类是容器类中的一个子集,为了区别表示,所...

22010
来自专栏java工会

如何实现一个简单的-IOC

我们还记得Spring中最重要的有哪些组件吗?BeanFactory 容器,BeanDefinitionBean的基本数据结构,当然还需要加载Bean的资源加载...

711
来自专栏java初学

spring框架(1)— 依赖注入

44612
来自专栏LuckQI

学习Java基础知识,打通面试关~十二接口与抽象类

924

扫码关注云+社区