干货放前面;

从猿类的思维角度来说,抽象工厂模式就是创建一个管理各个接口的抽象类,调用的时候通过抽象类调用!

这种模式的缺点很显而易见:当你需要新增一个系列的时候,既需要修改抽象类的声明,又需要添加抽象类的实现,而且它还同时具有工厂模式的缺点,以及在这个无论什么编程都以代码行数少为傲的年代,大多数时候都用if ...else代替了。所以由于以上诸多问题,导致我们平时编程的时候基本上不会用它!

下面是从别的地方找的具体解释以及列子能够很好的解释何为抽象类!

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

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

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

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

实现

我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类FactoryProducer

AbstractFactoryPatternDemo,我们的演示类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE),以便获取它所需对象的类型。

//步骤 1
//为形状创建一个接口。

Shape.java
public interface Shape {void draw();
}

//步骤 2
//创建实现接口的实体类。
//Rectangle.java
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}//Square.java
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}//Circle.java
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}

//步骤 3
//为颜色创建一个接口。
//Color.javapublic interface Color {void fill();
}

//步骤4
//创建实现接口的实体类。//Red.java
public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}//Green.java
public class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}
}//Blue.java
public class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}
}

//步骤 5
//为 Color 和 Shape 对象创建抽象类来获取工厂。//AbstractFactory.java
public abstract class AbstractFactory {abstract Color getColor(String color);abstract Shape getShape(String shape) ;
}

//步骤 6
//创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。//ShapeFactory.java
public class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){if(shapeType == null){return null;}        if(shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();} else if(shapeType.equalsIgnoreCase("RECTANGLE")){return new Rectangle();} else if(shapeType.equalsIgnoreCase("SQUARE")){return new Square();}return null;}@OverrideColor getColor(String color) {return null;}
}//ColorFactory.java
public class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@OverrideColor getColor(String color) {if(color == null){return null;}        if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}
}

//步骤 7
//创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。//FactoryProducer.java
public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("SHAPE")){return new ShapeFactory();} else if(choice.equalsIgnoreCase("COLOR")){return new ColorFactory();}return null;}
}

//步骤 8
//使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。//AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法
      shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法
      shape2.draw();//获取形状为 Square 的对象Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法
      shape3.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法
      color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("Green");//调用 Green 的 fill 方法
      color2.fill();//获取颜色为 Blue 的对象Color color3 = colorFactory.getColor("BLUE");//调用 Blue 的 fill 方法
      color3.fill();}
}

//步骤 9
//验证输出。

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.

转载于:https://www.cnblogs.com/yangjinwang/p/6269744.html

设计模式:第二章--抽象工厂模式相关推荐

  1. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  2. 设计模式二、抽象工厂模式

    设计模式part2 1.     抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...

  3. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  4. 【设计模式】第5章·抽象工厂模式

    一.产品等级和产品族 为了更好的理解抽象工厂模式,引入了两个概念. 1,产品等级结构:产品等级结构即产品的继承结构. 2,产品族:在抽象工厂模式中,产品族是指有同一个工厂生产的位于不同产品等级结构中的 ...

  5. 软件设计模式--第二章 创建型模式--建造者模式

    目录 第二章 创建型模式 1.创建型模式概述 2.建造者模式 (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主要特点 将对象的创建 ...

  6. 软件设计模式--第二章 创建型模式-- 单例模式

    目录 第二章 创建型模式 1.创建型模式概述 2.单例模式(Singleton) (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主 ...

  7. 设计模式普及之抽象工厂模式

    本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...

  8. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  9. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  10. java设计模式六(抽象工厂模式)

    java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...

最新文章

  1. php 长连接心跳_支持gRPC长链接,深度解读Nacos2.0架构设计及新模型
  2. leetcode算法题--最多的不重叠子字符串★★
  3. 利用Cobbler批量布署CentOS
  4. 服务器维护菜单,Romley平台BIOS常用操作
  5. boost::connected_components用法的测试程序
  6. android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现
  7. ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
  8. 87个常用电脑快捷键大全,别让速度限制你的工资,建议收藏一份!
  9. 关于路径的问题(以后会慢慢的补进来)
  10. go list指针_「GCTT 出品」Go 语言机制之内存剖析
  11. php 1个中文几个字节,PHP函数第15款:gbk中文截取,1个中文字节为2个英文字节 cn_substr...
  12. 2017-7-8 OpenStack手工+oz自动制作CentOS 7.3镜像
  13. mysql数据库异地备份
  14. 用户账号被盗,京东回应:都怪QQ!库克:从来没获取过FB用户数据!
  15. 生存存疑?云计算第一股关停IoT公有云服务
  16. MATLAB实现大家来找茬GUI程序
  17. 详解电容触控芯片与指纹芯片的研发与生产流程
  18. scara机器人dh参数表_SCARA机器人技术参数.docx
  19. 梦幻仙缘剧情java_梦幻仙缘BT版
  20. 简单网络拓扑及相应的配置

热门文章

  1. Qt5学习笔记之零碎问题记录
  2. C#中声明、调用和配置事件的演示源码
  3. JavaEE——Mybatis(5)--resultMap自定义结果集封装
  4. bzoj4974 字符串大师
  5. Javascript中try finally的细微差别
  6. SSAS知识回放之订单数据分析
  7. Python发邮件的小脚本
  8. Microsoft SQL Server 2008 Management Studio Express 下载地址
  9. 三层结构中的数据层设计
  10. Ubuntu外观美化安装WPS