创建型模式 - 抽象工厂(创建产品族)

抽象工厂

1. 介绍

抽象工厂是对工厂模式的抽象,抽象工厂为客户提供接口,使客户在不必指定具体产品以及它们的关联关系情况下,创建产品族中多个产品对象。
如果没有抽象工厂,当一个产品方案包含一系列关联子产品时,会难以控制:需要针对每种方案事先定义好需要的产品组合,而且调用者不得不需要知道具体的类、如何创建具体的类,以及他们之间的关联关系。
而有了抽象工厂后,只需要通过工厂生成器传入响应的产生,告诉用户需要什么,就能创建出对应的产品方案,无需用户参与创建的过程,也不需要知道具体的产品类。

2. 意图

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

3. 示例

现在用户想创建填充颜色的形状,用户只想制定形状、颜色等基本信息,而不想关注具体如何创建形状对象和颜色对象,以及它们之间是如何关联到一起的。

4. UML类图

5. 演示代码

  1. 创建Shape接口
// Shape.java
public interface Shape{
    void draw();
}
  1. 创建实现Shape接口的实体类
// Rectangle.java
public class Rectangle implements Shape{
    @override
    public void draw(){
        System.out.println("Rectangle::draw() method");
    }
}

// Square.java
public class Sqaure implements Shape {
    @override
    public void draw() {
        System.out.println("Square::draw() method");
    }
}

// Circle.java
public class Circle implements Shape {
    @override
    public void draw() {
        System.out.println("Circle::draw() method");
    }
}
  1. 创建Color接口
// Color.java
public interface Color{
    void fill();
}
  1. 创建实现Color接口的实体类
// Red.java
public class Red implements Color {
    @override
    void fill() {
        System.out.prinln("Red::fill() method");
    }
}

// Green.java
public class Green implements Color {
    @override
    void fill() {
        System.out.prinln("Green::fill() method");
    }
}

// Blue.java
public class Blueimplements Color {
    @override
    void fill() {
        System.out.prinln("Blue::fill() method");
    }
}
  1. 为Color和Shape对象创建抽象类来获取工厂
// AbstractFactory
public abstract class AbstractFactory {
    public abstract Shape getShape(String s);
    public abstract Color getColor(String s);
}
  1. 实现抽象工厂类ShapeFactory, ColorFactory
// ShapeFactory
public class ShapeFactory extends AbstractFactory {
    @Override    
    public Shape getShape(String s) {
        if(s == null) return null;
        else if(s.equalsIgnoreCase("Circle") )
            return new Shape();
        else if(s.equalsIgnoreCase("RECTANGLE"))
            return new Rectangle();
        else if(s.equalsIgnoreCase("SQUARE"))
            return new Square();
        return null;
    }
}

// ColorFactory.java
public class ColorFactory extends AbstractFactory {
    @Override
    public Color getColor(String s) {
        if(s == null) return null;
        else if(s.equalsIgnoreCase("RED") )
            return new Red();
        else if(s.equalsIgnoreCase("GREEN"))
            return new Green();
        else if(s.equalsIgnoreCase("BLUE"))
            return new Blue();
        return null;
    }
}
  1. 创建工厂创造器,通过传递 形状或颜色信息来获取工厂
// 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();
        retur null;
    }
}
  1. 使用FactoryProducer来获取AbstractFactory,通过传递类型信息来获取实体类的对象
// AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 
        Shape shape1 = shapeFactory.getShape("CIRCLE);
        shape1.draw();

        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();

        Shape shape3 = shapeFactory.getShape("SQUARE");
        shape3.draw();
    
        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
        Color color1 = colorFactory.getColor("RED");
        color1.fill();

        Color color2 = colorFactory.getColor("GREEN");
        color2.fill();

        Color color3 = colorFactory.getColor("BLUE");
        color3.fill();
    }
}
  1. 运行结果
inner Circle::draw() methond
inner Rectangle::draw() methond
inner Square::draw() methond
inner Red::fill() method
inner Green::fill() method
inner Blue::fill() method

参考

  1. 三种工厂模式的分析以及C++实现, 博客园
  2. 设计模式之三:抽象工厂模式, CSDN
  3. 浅谈Java设计模式——单实例、简单工厂、抽象工厂、观察者, CSDN
posted @ 2018-08-28 23:23  明明1109  阅读(189)  评论(0编辑  收藏  举报