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

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

步骤 1

为形状创建一个接口。

 packagecom.demo.mode.mode01.abstractFactory.Shape.java

 public interface Shape {

   void draw();

 }

步骤 2

创建实现接口的实体类。

 package com.demo.mode.mode01.abstractFactory.Rectangle.java

 public class Rectangle implements Shape {

   public void draw() {

       System.out.println("execute Rectangle::draw()method.");

   }

 }

 package com.demo.mode.mode01.abstractFactory.Square.java

  public class Square implements Shape {

   public void draw() {

      System.out.println("execute Circle::draw()method.");

   }

 }

 package com.demo.mode.mode01.abstractFactory.Circle.java

 public class Circle implements Shape {

   public void draw() {

      System.out.println("execute Circle::draw()method.");

   }

 }

步骤 3

为颜色创建一个接口。

 package com.demo.mode.mode01.abstractFactory.Color.java

 public interface Color {

   // 填充颜色

   void fill();

 }

步骤4

创建实现接口的实体类。

 package com.demo.mode.mode01.abstractFactory.Red.java

 public class Red implements Color {

   public void fill() {

       System.out.println("execute Red::fill()method.");

   }

 }

 package com.demo.mode.mode01.abstractFactory.Green.java

 public class Green implements Color {

   public void fill() {

       System.out.println("execute Green::fill()method.");

   }

 }

 package com.demo.mode.mode01.abstractFactory.Blue.java

 public class Blue implements Color {

   public void fill() {

       System.out.println("execute Blue::fill()method.");

   }

 }

步骤 5

为 Color 和 Shape 对象创建抽象类来获取工厂。

 package com.demo.mode.mode01.abstractFactory.AbstractFactory.java public abstract class AbstractFactory {

   abstract Color getColor( String color);

   abstract Shape getShape( String shape);

 }

步骤 6

创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。

 package com.demo.mode.mode01.abstractFactory.ShapeFactory.java

 public class ShapeFactory  extends AbstractFactory{

   /**

    * 使用 getShape 方法获取形状类型的对象

    * @author xg.qiu<br/>

    * @since JDK 1.7

    * @time Jul 28, 2015

    * @param shapeType 形状类型

    * @return shape对象

    */

   public Shape getShape(String shapeType) {

      Shape shape = null;

      if ("Circle".equals(shapeType)) {

        shape = new Circle();

 } else if ("Rectangle".equals(shapeType)) {

        shape = new Rectangle();

      } else if ("Square".equals(shapeType)) {

        shape = new Square();

      }

      return shape;

   }

   public Color getColor(String color) {

      return null;

   }

 }

 package com.demo.mode.mode01.abstractFactory.ColorFactory.java public class ColorFactory extends AbstractFactory {

   /**

    * 使用 getColor 获得颜色

    * @author xg.qiu<br/>

    * @since JDK 1.7

    * @time Jul 28, 2015

    * @param colorStr 颜色字符串

    * @return color对象

    */

   public Color getColor(String colorStr) {

      Color color = null;

      if ("Red".equalsIgnoreCase(colorStr)) {

         color = new Red();

 } else if ("Green".equalsIgnoreCase(colorStr)) {

         color = new Green();

 } else if ("Blue".equalsIgnoreCase(colorStr)) {

         color = new Blue();

       }

      return color;

   }

   public Shape getShape(String shape) {

      return null;

   }

 }

步骤 7

创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。

 package com.demo.mode.mode01.abstractFactory.FactoryProducer.java

 public class FactoryProducer {

   public static AbstractFactory getFactory(String choice){

      AbstractFactory factory = null;

       if("Shape".equalsIgnoreCase(choice)){

         factory = new ShapeFactory();

       }else if("Color".equalsIgnoreCase(choice)){

         factory = new ColorFactory();

       }

       return factory;

    }

 }

步骤 8

使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。

 package com.demo.mode.mode01.abstractFactory.AbstractFactoryPatternDemo.java

 public class AbstractFactoryPatternDemo {

   public static void main(String[] args) {

      //1.获取形状

      AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape");

      //2.获取颜色

      AbstractFactory colorFactory = FactoryProducer.getFactory("Color");

      //3.传递形状

      Shape shape =shapeFactory.getShape("Circle");

      //4.传递颜色

      Color color =colorFactory.getColor("Red");

      //5.绘制形状

      shape.draw();

      //6.填充颜色

      color.fill();   

   }

 }

步骤 9

验证输出。

execute Circle::draw() method.

execute Red::fill() method.

Java设计模式之——抽象工厂的更多相关文章

  1. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  2. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  3. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  4. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  5. [译]Java 设计模式之抽象工厂

    (文章翻译自Java Design Pattern: Abstract Factory) 抽象工厂模式针对工厂模式增加了抽象层.如果我们使用抽象工厂模式和工厂模式比较的话,很明显抽象工厂模式增加了一个 ...

  6. Java设计模式之抽象工厂

    概述 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  7. Java 设计模式之抽象工厂模式

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

  8. [java] java 设计模式(2):抽象工厂模式(Abstract Factory)

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

  9. Java设计模式(3)——抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...

随机推荐

  1. Set集合学习

    Java中的Set主要有:HashSet.TreeSet.LinkedHashSet. 一:HashSet HashSet 是一个没有重复元素的无序集合. HashSet由HashMap实现的,不保证 ...

  2. hadoop2.x配合ZooKeeper集群环境搭建

    前期准备就不详细说了,课堂上都介绍了1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系 ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机 ...

  3. Linux下Eclipse配置安装 PyDev(Pydev插件一直不能成功,安装这个插件失败的问题)

    pydev插件安装方式如果采取从网络上下载,然后解压到eclipse中文件夹到方式,运行到时候可能会导致重启eclipse后根本看不到这个插件! 原因以及解决方式,看下面!  转自:http://ww ...

  4. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递 【转】

    原文:http://www.cnblogs.com/lori/p/4045633.html 下面定义一个复杂类型对象 public class User_Info { public int Id { ...

  5. fpga pll重配置实验总结

    今天做了pll重配置的实验,输入时钟50m初始配置输出75m经重配置后输出100m,带宽为low,使用的ip:rom,altpll_reconfig ,altpll,将altpll配置为可重配置模式, ...

  6. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(上)

    http://forum.china.unity3d.com/thread-32271-1-1.html 我们已经发布了Unite 2018 江毅冰的<发条乐师>.Hit-Point的&l ...

  7. 服务器用 git 进行部署出现代码冲突的处理

    服务器用 git 进行部署出现代码冲突的处理 起因: 由于项目是之前很久之前上传的,且并没上线.使用 git pull 进行代码更新时出现很多冲突. 因为服务器上的代码有移动过位置,不知道为什么就冲突 ...

  8. Cookie Session 和Django分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. 本地tomcat调用远程接口报错:java.lang.reflect.InvocationTargetException

    今天碰到一个奇怪的问题,本地Eclipse起了一个tomcat通过http去调一个外部接口,结果竟然报了一个反射的异常,先看下完整日志: , :: 下午 org.apache.catalina.sta ...

  10. expdp实现oracle远程服务器导出到本地

    expdp导出 expdp user/pwd@orcl directory=dd network_link=dblink dumpfile=fileName.dmp //user为本地用户名 //ne ...