Java学设计模式之工厂模式(含抽象工厂)

一、工厂模式概念

1.1 什么是代理模式

工厂模式是一种创建型设计模式,用于创建对象而不需要暴露对象的创建逻辑。它将对象的实例化过程封装在一个单独的类中,使得客户端代码只需通过调用工厂类的方法来获取所需的对象,而无需关心具体的实例化过程。

工厂模式通常有三种主要的变体:简单工厂模式、工厂方法模式和抽象工厂模式。

  1. 简单工厂模式(Simple Factory Pattern):由一个工厂类根据传入的参数决定创建哪一种产品类的实例。

  2. 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

  3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。

1.2 工厂模式架构示意图

  1. 简单工厂模式

image

  1. 工厂方法模式

image

  1. 抽象工厂模式

工厂方法模式与抽象工厂模式的区别在于:

  1. 工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。

  2. 抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例

二、简单工厂模式代码

2.1 公共接口

public abstract class Color {
    public Color() {
    }
}

2.2 产品类

public class Blue extends Color {
    public Blue() {
        System.out.println("获得蓝色");
    }
}
public class Red extends Color {
    public Red() {
        System.out.println("获得红色");
    }
}

2.3 工厂类

public class ColorFactory {
    public Color getColor(String color) {
        switch (color) {
            case "blue":
                return new Blue();
            case "red":
                return new Red();
            default:
                break;
        }
        return null;
    }
}

2.4 测试类

public class FactoryPatternTest {
    public static void main(String[] args) {
        ColorFactory colorFactory = new ColorFactory();
        Color red = colorFactory.getColor("red");
        // 输出:获得红色
    }
}

三、工厂方法代码

3.1 公共产品接口

public abstract class Color {
    public Color() {
    }
}

3.2 产品实现类

public class Blue extends Color {
    public Blue() {
        System.out.println("获得蓝色");
    }
}
public class Red extends Color {
    public Red() {
        System.out.println("获得红色");
    }
}

3.3 公共工厂接口

public interface ColorFactory {

    Color getColor();

}

3.4 工厂实现类

public class BlueFactory implements ColorFactory{
    @Override
    public Blue getColor() {
        return new Blue();
    }
}
public class RedFactory implements ColorFactory{
    @Override
    public Red getColor() {
        return new Red();
    }
}

3.5 测试类

public class FactoryPatternTest {
    public static void main(String[] args) {
        RedFactory redFactory = new RedFactory();
        redFactory.getColor();
        // 输出:获得红色
        BlueFactory blueFactory = new BlueFactory();
        blueFactory.getColor();
        // 输出:获得蓝色
    }
}

四、抽象工厂代码

4.1 公共产品接口

public interface Color {
}
public interface Size {
}

4.2 产品实现类

public class Red implements Color {
    public Red() {
        System.out.println("获得颜色红色");
    }
}

public class Blue implements Color {
    public Blue() {
        System.out.println("获得颜色蓝色");
    }
}
public class Big implements Size{
    public Big() {
        System.out.println("获得尺寸大号");
    }
}
public class Small implements Size{
    public Small() {
        System.out.println("获得尺寸小号");
    }
}

4.3 公共工厂接口

public abstract class AbstractFactory {

    public abstract Color getColor();

    public abstract Size getSize();

}

4.4 工厂实现类

public class AFactory extends AbstractFactory {
    @Override
    public Color getColor() {
        return new Blue();
    }

    @Override
    public Size getSize() {
        return new Big();
    }
}
public class BFactory extends AbstractFactory {

    @Override
    public Color getColor() {
        return new Red();
    }

    @Override
    public Size getSize() {
        return new Small();
    }
}

4.5 测试类

public class FactoryPatternTest {
    public static void main(String[] args) {
        AFactory aFactory = new AFactory();
        aFactory.getColor();
        aFactory.getSize();
        // 输出:获得颜色蓝色
        // 输出:  获得尺寸大号
        BFactory bFactory = new BFactory();
        bFactory.getColor();
        bFactory.getSize();
        // 输出:获得颜色红色
        // 输出:获得尺寸小号
    }
}

五、总结

工厂模式在实际开发中经常被使用,它将对象的创建过程与客户端代码分离,提高了代码的可维护性和可扩展性。

参考资料

posted @ 2024-05-09 09:53  Kllin  阅读(131)  评论(0编辑  收藏  举报