设计模式--抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)详解

在软件开发中,当我们需要创建一组相关或互相依赖的对象时,简单工厂模式和工厂方法模式可能显得力不从心。此时,抽象工厂模式(Abstract Factory Pattern)就派上用场了。本文将深入探讨抽象工厂模式,帮助你理解和应用这一强大的设计模式。

什么是抽象工厂模式?

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。通过抽象工厂模式,我们可以将一组相关对象的创建逻辑封装在一起,从而实现对象创建的高内聚和低耦合。

示例:创建不同类型的形状和颜色对象

为了更好地理解抽象工厂模式,我们来看一个具体的示例。假设我们需要创建不同类型的形状(如圆形、矩形和正方形)以及颜色(如红色、绿色和蓝色)对象。

第一步:定义抽象产品接口

首先,我们定义形状和颜色的抽象产品接口。

java 复制代码
// 形状接口
public interface Shape {
    void draw();
}

// 颜色接口
public interface Color {
    void fill();
}
第二步:创建具体产品类

接下来,我们创建实现 ShapeColor 接口的具体产品类。

java 复制代码
// 具体形状类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Rectangle");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

// 具体颜色类
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Red");
    }
}

public class Green implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Green");
    }
}

public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Blue");
    }
}
第三步:定义抽象工厂接口

我们定义一个抽象工厂接口,用于创建形状和颜色对象。

java 复制代码
public interface AbstractFactory {
    Shape createShape(String shapeType);
    Color createColor(String colorType);
}
第四步:创建具体工厂类

然后,我们创建实现 AbstractFactory 接口的具体工厂类,每个具体工厂类负责创建一种产品族。

java 复制代码
public class ShapeFactory implements AbstractFactory {
    @Override
    public Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }

    @Override
    public Color createColor(String colorType) {
        return null; // ShapeFactory 不负责创建颜色对象
    }
}

public class ColorFactory implements AbstractFactory {
    @Override
    public Shape createShape(String shapeType) {
        return null; // ColorFactory 不负责创建形状对象
    }

    @Override
    public Color createColor(String colorType) {
        if (colorType == null) {
            return null;
        }
        if (colorType.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (colorType.equalsIgnoreCase("GREEN")) {
            return new Green();
        } else if (colorType.equalsIgnoreCase("BLUE")) {
            return new Blue();
        }
        return null;
    }
}
第五步:创建工厂生成器类

为了简化客户端代码,我们创建一个工厂生成器类,用于获取具体工厂类的实例。

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();
        }
        return null;
    }
}
第六步:使用抽象工厂模式创建对象

最后,我们在客户端代码中使用抽象工厂模式来创建不同的形状和颜色对象。

java 复制代码
public class Client {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
        Shape shape1 = shapeFactory.createShape("CIRCLE");
        shape1.draw();

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

        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
        Color color1 = colorFactory.createColor("RED");
        color1.fill();

        Color color2 = colorFactory.createColor("GREEN");
        color2.fill();
    }
}
抽象工厂模式的优点
  1. 分离接口与实现:抽象工厂模式通过工厂接口将客户端代码与具体类的实现分离,使代码更具灵活性。
  2. 提高可扩展性:添加新的产品族时,只需创建新的具体工厂类,不需要修改现有代码,符合开闭原则(Open/Closed Principle)。
  3. 一致的对象创建:确保同一产品族的对象在客户端代码中始终以一致的方式创建。
抽象工厂模式的缺点
  1. 增加系统复杂度:由于需要定义多个工厂类和产品类,系统的类数量增加,复杂度提高。
  2. 难以支持新种类的产品:如果需要添加新的产品类型(而不是新的产品族),可能需要修改抽象工厂接口及其所有实现类。
总结

抽象工厂模式通过提供一个创建一系列相关或依赖对象的接口,极大地增强了代码的可扩展性和可维护性。尽管其实现较为复杂,但在需要创建多个相关对象且希望保证创建过程的一致性时,抽象工厂模式是一个非常有力的工具。希望通过这个示例,你能更好地理解和应用抽象工厂模式,让你的代码更加优雅和高效。

相关推荐
matrixlzp4 小时前
Java 责任链模式 减少 if else 实战案例
java·设计模式
编程、小哥哥6 小时前
设计模式之组合模式(营销差异化人群发券,决策树引擎搭建场景)
决策树·设计模式·组合模式
hxj..7 小时前
【设计模式】外观模式
java·设计模式·外观模式
吾与谁归in7 小时前
【C#设计模式(10)——装饰器模式(Decorator Pattern)】
设计模式·c#·装饰器模式
无敌岩雀9 小时前
C++设计模式行为模式———命令模式
c++·设计模式·命令模式
In_life 在生活18 小时前
设计模式(四)装饰器模式与命令模式
设计模式
瞎姬霸爱.19 小时前
设计模式-七个基本原则之一-接口隔离原则 + SpringBoot案例
设计模式·接口隔离原则
鬣主任20 小时前
Spring设计模式
java·spring boot·设计模式
程序员小海绵【vincewm】21 小时前
【设计模式】结合Tomcat源码,分析外观模式/门面模式的特性和应用场景
设计模式·tomcat·源码·外观模式·1024程序员节·门面模式
丶白泽21 小时前
重修设计模式-行为型-命令模式
设计模式·命令模式