定义
定义一个用于创建对象的接口,让其子类决定实例化哪一个类,Factory Method使得一个类的实例化延迟到子类
应用场景
- 当不知道使用对象的确切类型的时候
- 当希望为库或框架提供其内部组件的方法时
主要优点
- 将具体实例和创建者解耦
- 符合单一职责原则
- 符合开闭原则
实现方式
在工厂方法模式中,抽象工厂和抽象产品是核心,而具体工厂和具体产品则根据实际需求进行扩展和实现。
通过这些角色的协作,工厂方法模式实现了将产品的创建过程封装起来,使得客户端与具体产品解耦,同时也提供了灵活性和可扩展性。
1、抽象产品类和具体产品类
首先定义一个抽象产品类 Product
:
public abstract class Product {
public abstract void use();
// 所有子类都可公共的方法
public void test(){
System.out.println("test");
}
}
然后创建具体产品类,如 ConcreteProductA
和 ConcreteProductB
,它们分别继承自 Product
并实现了其中的抽象方法。
public class ConcreteProductA extends Product {
@Override
public void use(){
System.out.println("use ConcreteProductA");
}
}
public class ConcreteProductB extends Product {
@Override
public void use(){
System.out.println("use ConcreteProductB");
}
}
2、抽象工厂类和具体工厂类
接下来定义一个抽象工厂类 Factory
,其中包含一个抽象的工厂方法 createProduct()
,用于创建具体的产品对象
public abstract class Factory {
public abstract Product createProduct();
}
对于每个具体产品,创建相应的具体工厂类:
public class ConcreteFactoryA extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
3、客户端代码
在客户端代码中,我们可以根据需要选择不同的具体工厂类来创建产品对象。
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactoryA();
Product product = factory.createProduct();
product.use();
product.test();
}
}
评论区