前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式二十四章经之抽象工厂模式

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

作者头像
我就是马云飞
发布2018-06-22 17:41:19
2700
发布2018-06-22 17:41:19
举报
文章被收录于专栏:我就是马云飞我就是马云飞

概述

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

使用场景

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

具体实现

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

代码语言:javascript
复制
public interface Shape {
   void draw();
}

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

代码语言:javascript
复制
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.");
   }
}

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

代码语言:javascript
复制
public interface Color{
  void fill();
}

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

代码语言:javascript
复制
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");
  }
}

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

代码语言:javascript
复制
public abstract class Factory{
  public abstract Shape createShape();
  public abstract Color createColor();
}

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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();
  }
}

输出结果如下:

代码语言:javascript
复制
Square:draw() method.
Color:Red
Circle:draw() method.
Color:Blue

总结

优点:

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

缺点:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我就是马云飞 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用场景
  • 具体实现
  • 总结
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档