工厂方法模式

工厂方法模式(Factory Method Pattern

意图

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

编写工厂类时不需要知道实际创建的产品是哪一个,选择了使用哪个子类,自然就决定了实际创建的产品是什么。

动机

在不修改具体工厂类的情况下引进新的产品,如果出现新的产品类型,只需要为这种新的产品创建一个具体的工厂类就可以获得该新产品的实例。这样可以将产品的“实现”从“使用”中解耦,相对于简单工厂模式更加符合“开闭原则”。

适用性

工厂方法模式通常适用于以下场景:

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 格力空调工厂、美的空调工厂等。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的类型。

结构


实现

// 抽象产品
public interface Product {
    void show();
}

// 具体产品A
public class ConcreteProductA implements Product {
    @Override
    public void show() {
        System.out.println("具体产品A。。。");
    }
}
// 抽象工厂
public interface FactoryMethod {	
	Product createProduct();
}
// 具体工厂
public class ConcreteFactoryA implements FactoryMethod {
	@Override
	public Product createProduct() {
		System.out.println("具体工厂A,new了一个具体产品A");
		return new ConcreteProductA();
	}
}


// 测试客户端
public class TestClient {
    public static void main(String[] args) throws Exception {
        Class<?> c = Class.forName("com.dj.pattern.factoryMethod.ConcreteFactoryA");
        FactoryMethod  factory = (FactoryMethod)c.newInstance();
        Product product = factory.createProduct();
        product.show();
    }
}

已知应用

相关模式

简单工厂把全部的产品类,在一个工厂类中处理,而工厂方法是创建了一个框架,让具体的子工厂生产相应的产品,新增产品时,只需要增加对应的工厂,无须对原工厂进行任何修改,比简单工厂更有弹性。但是,每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这无疑增加了系统的复杂度。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值