JAVA23种设计模式之抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

介绍

意图 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:解决接口选择的问题。
使用时机:产品有多于一个的产品族,而系统只消费其中某一族的产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码

实现

首先我们定义一个绘画(Shape)接口及颜色(Color)接口,之后实现该接口的三个绘画类(RectangleDrawSquareDrawCircleDraw)及三个颜色类(RedColorGreeColorBlueColor),下一步我们创建一个绘画工厂(ShapeFactory)及颜色工厂(ColorFactory)来管理实例化这些类,创建抽象工厂,使其具备创建绘画与颜色的功能。
新建一个工厂创造者(FactoryCreate),它可以创建不同的工厂。
绘画接口及实现类

public interface Shape {
    void draw();
}
public class CircleDraw implements Shape {
    @Override
    public void draw() {
        System.out.println("我会画圆形!");
    }
}
public class RectangleDraw implements Shape {
    @Override
    public void draw() {
        System.out.println("我会画长方形!");
    }
}
public class SquareDraw implements Shape {
    @Override
    public void draw() {
        System.out.println("我会画正方形!");
    }
}

颜色接口与实现类

public interface Color {
    void fill(); //渲染
}
public class BlueColor implements Color {
    @Override
    public void fill() {
        System.out.println("我是蓝色颜料!");
    }
}
public class GreeColor implements Color{
    @Override
    public void fill() {
        System.out.println("我是绿色颜料!");
    }
}
public class RedColor implements Color {
    @Override
    public void fill() {
        System.out.println("我是红色颜料!");
    }
}

抽象工厂

public abstract class AbstractFactory {
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape);
}

绘画工厂及颜色工厂

public class ShapeFactory extends AbstractFactory{

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

    public Shape getShape(String shapeType){

        if(null == shapeType){
            return null;
        }

        switch (shapeType){
            case "RECTANGLE":
                return new RectangleDraw();
            case "SQUARE":
                return new SquareDraw();
            case "CIRCLE":
                return new CircleDraw();
        }

        return null;

    }

}
public class ColorFactory extends AbstractFactory{

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

    public Color getColor(String color){
        if(null == color){
            return null;
        }
        switch (color){
            case "RED":
                return new RedColor();
            case "GREE":
                return new GreeColor();
            case "BLUE":
                return new BlueColor();
        }
        return null;
    }

}

工厂创建者

public class FactoryCreate {

    public static AbstractFactory getFactory(String type){
        if(type.equals("shape")){
            return new ShapeFactory();
        }
        if(type.equals("color")){
            return new ColorFactory();
        }
        return null;
    }

}

测试

public class AbstractFactoryTest {

    public static void main(String[] args) {

        AbstractFactory shapeFactory = FactoryCreate.getFactory("shape");
        Shape shape1 = shapeFactory.getShape("RECTANGLE");
        shape1.draw();
        Shape shape2 = shapeFactory.getShape("SQUARE");
        shape2.draw();
        Shape shape3 = shapeFactory.getShape("CIRCLE");
        shape3.draw();

        AbstractFactory colorFactory = FactoryCreate.getFactory("color");
        Color color1 = colorFactory.getColor("RED");
        color1.fill();
        Color color2 = colorFactory.getColor("GREE");
        color2.fill();
        Color color3 = colorFactory.getColor("BLUE");
        color3.fill();

    }

}

运行结构:

我会画长方形!
我会画正方形!
我会画圆形!
我是红色颜料!
我是绿色颜料!
我是蓝色颜料!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值