2.工厂模式(创建型)-灵析社区

菜鸟码转

二、 工厂模式(创建型)

在复杂的系统中,使用直接实例化对象的方式来创建产品,可能会带来以下一些问题:

  • 高耦合性:如果直接在代码中实例化具体的产品类,客户端代码就会依赖于这些具体类。如果需要更换产品类,就需要修改客户端代码,这样会导致高耦合性;
  • 代码重复:如果有多个地方需要创建同一个产品,就需要在每个地方都进行实例化,这样就会造成大量的代码重复和维护困难;
  • 扩展性差:如果需要添加新的产品类,就需要修改原有的代码并增加新的实例化逻辑,这样会导致代码的可维护性和扩展性变差。

在实际开发中,为了解决上述问题,我们通常会使用工厂方法模式来创建产品对象。通过将对象的创建过程封装在工厂类中,并提供一个通用的工厂接口,客户端只需要通过工厂接口来创建产品对象即可,从而避免了直接实例化具体产品类所带来的问题。

工厂方法模式的应用场景

工厂方法模式常常应用在以下几种场景中:

  • 当一个类不知道它所需要的对象的类时。 在工厂方法模式中,客户端通过工厂接口来创建产品对象。这样客户端就可以避免直接实例化具体产品类,从而消除了对具体产品类的依赖性;
  • 当一个类希望由子类来指定它所创建的对象时。 工厂方法模式通过将对象的创建延迟到具体工厂类中来实现解耦合。具体产品类是由具体工厂类创建的,这样就可以让子类来决定要创建哪个类的实例;
  • 当一个类需要通过其他系统或者组件来获取对象时。 工厂方法模式经常被用于框架中,这些框架会根据配置文件或者运行时参数来决定实例化哪个对象。这样可以使得框架更加灵活,并且可以让使用者自定义对象的实例化过程;
  • 当一个类需要根据不同的条件来创建不同的对象时。 在工厂方法模式中,具体工厂类可以根据不同的条件来创建不同的产品对象。这样就可以提供更加灵活和可扩展的实例化方式。

示例代码

下面是一个简单的 Java 工厂方法模式的示例代码:

首先,定义一个接口 Product,它有一个方法 void use():

public interface Product {

    void use();
  
}

接下来,定义两个实现 Product 接口的具体产品类 ConcreteProductA 和 ConcreteProductB,它们分别实现 use() 方法:

public class ConcreteProductA implements Product {
  
    @Override
    public void use() {
        System.out.println("使用 ConcreteProductA");
    }
  
}

public class ConcreteProductB implements Product {
  
    @Override
    public void use() {
        System.out.println("使用 ConcreteProductB");
    }
  
}

然后,定义一个抽象工厂类 Creator,它有一个抽象工厂方法 Product factoryMethod(),用于创建产品实例:

public abstract class Creator {
  
    public abstract Product factoryMethod();
  
}

最后,定义两个具体工厂类 ConcreteCreatorA 和 ConcreteCreatorB,它们实现了 factoryMethod() 方法,分别创建 ConcreteProductA 和 ConcreteProductB 实例:

public class ConcreteCreatorA extends Creator {
  
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
  
}

public class ConcreteCreatorB extends Creator {
  
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
  
}

现在可以使用工厂方法模式创建不同的产品实例了。例如,创建 ConcreteProductA 实例:

Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.use(); 
// 输出:使用 ConcreteProductA

创建 ConcreteProductB 实例:

Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.use(); 
// 输出:使用 ConcreteProductB

总结

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪个类。也就是说,工厂方法模式将对象的实例化交给子类去完成,从而使得代码更加灵活和可扩展。

在工厂方法模式中,通常会有一个抽象工厂类和多个具体工厂类。抽象工厂定义了一个工厂方法,用于创建产品对象,并且该方法通常是抽象的。具体工厂类则实现了抽象工厂中的工厂方法,用于实例化具体的产品对象。

阅读量:2020

点赞量:0

收藏量:0