工厂方法模式|设计模式


工厂方法模式

引言:

顾名思义,工厂方法模式,指的就是使用工厂类,让工厂类代替创建一些产品类实例。

在讲述工厂方法之前,先来认识一下简单工厂模式。

简单工厂

简单工厂模式不属于23种模式之一,但是其较为直接简单,利与我们对工厂方法模式的理解。我们可以先查看其类图。

image-20230521234808761

简单工厂模式十分的直接,只需要定义一个通用的创建接口或者是抽象类,让具体产品类去实现它。继而,定义一个工厂,让工厂做出判断是需要创建某种产品类。最后客户端调用者直接调用工厂来创建即可。

// 定义抽象产品类
abstract class Product {
    public abstract void use();
}

// 定义具体产品类A
class ConcreteProductA extends Product {
    public void use() {
        System.out.println("使用产品A");
    }
}

// 定义具体产品类B
class ConcreteProductB extends Product {
    public void use() {
        System.out.println("使用产品B");
    }
}

// 定义工厂类
class Factory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        } else {
            return null;
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Product productA = Factory.createProduct("A");
        productA.use();  // 输出:使用产品A

        Product productB = Factory.createProduct("B");
        productB.use();  // 输出:使用产品B
    }
}

简单工厂使用场景如下:

  • 工厂负责创建的对象较为少
  • 客户无需关心创建逻辑

优点:避免直接创建实体类,减低耦合性 缺点:违反开闭原则,不利于做产品类的拓展。

工厂方法模式

在上述简单工厂模式的基础下,我们让其符合开闭原则,并变得易于拓展,即为工厂方法模式了。

具体类图如下:

image-20230522000711718

工厂方法模式,在工厂处也使用到抽象,这样子使得客户端在调用的时候,连输入值都无需传入了,也使得类与类之间更加的解耦。这么处理让各其符合了开闭原则,需要做出拓展时候,再创建一个新的工厂类即可,而依旧禁止对修改的处理。

// 定义抽象产品类
abstract class Product {
    public abstract void use();
}

// 定义具体产品类A
class ConcreteProductA extends Product {
    public void use() {
        System.out.println("使用产品A");
    }
}

// 定义具体产品类B
class ConcreteProductB extends Product {
    public void use() {
        System.out.println("使用产品B");
    }
}

// 定义抽象工厂类
abstract class Factory {
    public abstract Product createProduct();
}

// 定义具体工厂类A
class ConcreteFactoryA extends Factory {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 定义具体工厂类B
class ConcreteFactoryB extends Factory {
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.use();  // 输出:使用产品A

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.use();  // 输出:使用产品B
    }
}

工厂模式在继承简单工厂模式的优点,把不符合开闭原则的缺点解决了,使其成为一个典型的设计模式。

参考

《Android进阶之光》


文章作者: DYJ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DYJ !
评论
  目录