• Java设计模式之——抽象工厂


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

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

    抽象工厂模式的 UML 图

    步骤 1

    为形状创建一个接口。

    1 packagecom.demo.mode.mode01.abstractFactory.Shape.java
    2 
    3 public interface Shape {
    4 
    5   void draw();
    6 
    7 }

    步骤 2

    创建实现接口的实体类。

     1 package com.demo.mode.mode01.abstractFactory.Rectangle.java
     2 
     3 public class Rectangle implements Shape {
     4 
     5   public void draw() {
     6 
     7       System.out.println("execute Rectangle::draw()method.");
     8 
     9   }
    10 
    11 }
    12 
    13 package com.demo.mode.mode01.abstractFactory.Square.java
    14 
    15  public class Square implements Shape {
    16 
    17   public void draw() {
    18 
    19      System.out.println("execute Circle::draw()method.");
    20 
    21   }
    22 
    23 }
    24 
    25 package com.demo.mode.mode01.abstractFactory.Circle.java
    26 
    27 public class Circle implements Shape {
    28 
    29   public void draw() {
    30 
    31      System.out.println("execute Circle::draw()method.");
    32 
    33   }
    34 
    35 }

    步骤 3

    为颜色创建一个接口。

    1 package com.demo.mode.mode01.abstractFactory.Color.java
    2 
    3 public interface Color {
    4 
    5   // 填充颜色
    6 
    7   void fill();
    8 
    9 }

    步骤4

    创建实现接口的实体类。

     1 package com.demo.mode.mode01.abstractFactory.Red.java
     2 
     3 public class Red implements Color {
     4 
     5   public void fill() {
     6 
     7       System.out.println("execute Red::fill()method.");
     8 
     9   }
    10 
    11 }
    12 
    13 package com.demo.mode.mode01.abstractFactory.Green.java
    14 
    15 public class Green implements Color {
    16 
    17   public void fill() {
    18 
    19       System.out.println("execute Green::fill()method.");
    20 
    21   }
    22 
    23 }
    24 
    25 package com.demo.mode.mode01.abstractFactory.Blue.java
    26 
    27 public class Blue implements Color {
    28 
    29   public void fill() {
    30 
    31       System.out.println("execute Blue::fill()method.");
    32 
    33   }
    34 
    35 }

    步骤 5

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

    1 package com.demo.mode.mode01.abstractFactory.AbstractFactory.java public abstract class AbstractFactory {
    2 
    3   abstract Color getColor( String color);
    4 
    5   abstract Shape getShape( String shape);
    6 
    7 }

    步骤 6

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

      1 package com.demo.mode.mode01.abstractFactory.ShapeFactory.java
      2 
      3 public class ShapeFactory  extends AbstractFactory{
      4 
      5   /**
      6 
      7    * 使用 getShape 方法获取形状类型的对象
      8 
      9    * @author xg.qiu<br/>
     10 
     11    * @since JDK 1.7
     12 
     13    * @time Jul 28, 2015
     14 
     15    * @param shapeType 形状类型
     16 
     17    * @return shape对象
     18 
     19    */
     20 
     21   public Shape getShape(String shapeType) {
     22 
     23      Shape shape = null;
     24 
     25      if ("Circle".equals(shapeType)) {
     26 
     27        shape = new Circle();
     28 
     29 } else if ("Rectangle".equals(shapeType)) {
     30 
     31        shape = new Rectangle();
     32 
     33      } else if ("Square".equals(shapeType)) {
     34 
     35        shape = new Square();
     36 
     37      }
     38 
     39      return shape;
     40 
     41   }
     42 
     43  
     44 
     45   public Color getColor(String color) {
     46 
     47      return null;
     48 
     49   }
     50 
     51 }
     52 
     53 package com.demo.mode.mode01.abstractFactory.ColorFactory.java public class ColorFactory extends AbstractFactory {
     54 
     55  
     56 
     57   /**
     58 
     59    * 使用 getColor 获得颜色
     60 
     61    * @author xg.qiu<br/>
     62 
     63    * @since JDK 1.7
     64 
     65    * @time Jul 28, 2015
     66 
     67    * @param colorStr 颜色字符串
     68 
     69    * @return color对象
     70 
     71    */
     72 
     73   public Color getColor(String colorStr) {
     74 
     75      Color color = null;
     76 
     77      if ("Red".equalsIgnoreCase(colorStr)) {
     78 
     79         color = new Red();
     80 
     81 } else if ("Green".equalsIgnoreCase(colorStr)) {
     82 
     83         color = new Green();
     84 
     85 } else if ("Blue".equalsIgnoreCase(colorStr)) {
     86 
     87         color = new Blue();
     88 
     89       }
     90 
     91      return color;
     92 
     93   }
     94 
     95  
     96 
     97   public Shape getShape(String shape) {
     98 
     99      return null;
    100 
    101   }
    102 
    103  
    104 
    105 }

    步骤 7

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

     1 package com.demo.mode.mode01.abstractFactory.FactoryProducer.java
     2 
     3 public class FactoryProducer {
     4 
     5   public static AbstractFactory getFactory(String choice){
     6 
     7      AbstractFactory factory = null;
     8 
     9       if("Shape".equalsIgnoreCase(choice)){
    10 
    11         factory = new ShapeFactory();
    12 
    13       }else if("Color".equalsIgnoreCase(choice)){
    14 
    15         factory = new ColorFactory();
    16 
    17       }
    18 
    19       return factory;
    20 
    21    }
    22 
    23 }

    步骤 8

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

     1 package com.demo.mode.mode01.abstractFactory.AbstractFactoryPatternDemo.java
     2 
     3 public class AbstractFactoryPatternDemo {
     4 
     5   public static void main(String[] args) {
     6 
     7      //1.获取形状
     8 
     9      AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape");
    10 
    11      //2.获取颜色
    12 
    13      AbstractFactory colorFactory = FactoryProducer.getFactory("Color");
    14 
    15      //3.传递形状
    16 
    17      Shape shape =shapeFactory.getShape("Circle");
    18 
    19      //4.传递颜色
    20 
    21      Color color =colorFactory.getColor("Red");
    22 
    23      //5.绘制形状
    24 
    25      shape.draw();
    26 
    27      //6.填充颜色
    28 
    29      color.fill();   
    30 
    31   }
    32 
    33 }

    步骤 9

    验证输出。

    execute Circle::draw() method.
    
    execute Red::fill() method.
  • 相关阅读:
    Python requests乱码的五种解决办法
    apache安装
    Python 跨文件调用函数 + 在一个文件中执行另一个文件
    配置IIS使用Python
    gradle编译
    字符串UTF8转JIS
    cannot be loaded because running scripts is disabled on this system的对策
    您知道eval中的和括号的含义吗
    Python 学习笔记
    windows装mysql一定要装vs和python吗
  • 原文地址:https://www.cnblogs.com/XQiu/p/5087893.html
Copyright © 2020-2023  润新知