设计模式之抽象工厂模式

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

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

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。

以下例子中的形状和颜色就属于一个产品族。

抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。

具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

这里补充一下抽象工厂模式和工厂方法模式区别,可以参考篇博客:https://blog.csdn.net/liu88010988/article/details/50799902

示例代码:

接口:形状接口和颜色接口

/**
 * 颜色接口
 *
 * @author wangbo
 * @date 2018-04-27 18:18:12
 */
public interface Color {
    void fill();
}
/**
 * 形状接口
 *
 * @author wangbo
 * @date 2018-04-27 18:10:20
 */
public interface Shape {
    void draw();
}

上面接口的实现类:

/**
 * 红色实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:19:19
 */
public class Red implements Color {

    @Override
    public void fill() {
        System.out.println("填充红色");
    }

}
/**
 * 绿色实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:21:09
 */
public class Green implements Color {

    @Override
    public void fill() {
        System.out.println("填充绿色");
    }

}
/**
 * 蓝色实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:21:43
 */
public class Blue implements Color {

    @Override
    public void fill() {
        System.out.println("填充蓝色");
    }

}
/**
 * 圆形实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:16:56
 */
public class Circle implements Shape {

    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }

}
/**
 * 长方形实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:14:01
 */
public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("画一个长方形");
    }

}
/**
 * 正方形实现类
 *
 * @author wangbo
 * @date 2018-04-27 18:15:34
 */
public class Square implements Shape {

    @Override
    public void draw() {
        System.out.println("画一个正方形");
    }

}

抽象工厂类

/**
 * 抽象工厂
 *
 * @author wangbo
 * @date 2018-04-27 18:24:37
 */
public abstract class AbstractFactory {
    abstract Color getColor(String color);
    abstract Shape getShape(String shape);
}

颜色工厂类

/**
 * 颜色工厂
 *
 * @author wangbo
 * @date 2018-04-27 18:39:40
 */
public class ColorFactory extends AbstractFactory {

    /**
     * 获取颜色
     */
    @Override
    Color 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;
    }

    @Override
    Shape getShape(String shape) {
        return null;
    }

}

形状工厂类

/**
 * 形状工厂
 *
 * @author wangbo
 * @date 2018-04-27 18:26:26
 */
public class ShapeFactory extends AbstractFactory {

    @Override
    Color getColor(String color) {
        return null;
    }

    /**
     * 获取形状
     */
    @Override
    Shape getShape(String shape) {
        if (shape == null) {
            return null;
        }
        if (shape.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shape.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shape.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }

}

工厂创建类

/**
 * 工厂创造器
 *
 * @author wangbo
 * @date 2018-04-27 18:47:26
 */
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;
    }

}

测试类

public class AbstractFactorTest {
    
    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();
    }

}

 

posted @ 2018-04-27 19:20  一线大码  Views(355)  Comments(0Edit  收藏  举报