设计模式(二) 工厂方法(FactoryMethod)

1.定义

工厂方法是一种对象创建型的设计模式。上一节中谈到的抽象工厂经常使用工厂方法实现。与其他创建型模式一样,工厂方法解决的是在不指定对象具体类型的情况下创建对象的问题。它仅定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类实例化延迟到其子类。

2.结构


Product : 定义工厂方法创建对象的接口

ConcreteProduct : 实现Product  接口

Creator : 声明工厂方法,该方法返回一个Product类型对象

ConcreteCreator : 重新定义工厂方法以返回一个ConcreteProduct实例

3.适用性

  • 当一个类不知道它所必须创建的类的时候
  • 当一个类希望它的子类来指定他所创建的对象的时候
  • 创建对象需要大量重复的代码

工厂方法常见于工具包和框架当中,这些库中可能需要创建客户端代码实现的具体类型的对象。

4.举例说明

其实工厂方法相当于简化了的抽象工厂,理解起来应该没什么难度。

我们定义DigitalDevice,DigitalDeviceFactory, Phone, PhoneFactory几个类/接口以及测试类Test:

DigitalDevice.java:

public class DigitalDevice {
	protected String name;
	protected double price;
}
DigitalDeviceFactory.java

interface DigitalDeviceFactory {
	DigitalDevice createDevice();
}
Phone.java

public class Phone extends DigitalDevice {
	public Phone(){
		name = "Phone";
		System.out.println("Im am phone.");
	}
}

PhoneFactory.java

public class PhoneFactory implements DigitalDeviceFactory {

	@Override
	public DigitalDevice createDevice() {
		// TODO Auto-generated method stub
		return new Phone();
	}

}

Test.java

public class Test {
	public static void main(String[] args) {
		DigitalDeviceFactory factory = new PhoneFactory();
		factory.createDevice();
	}
}
控制台输出:

Im am phone.

通过ConcreteFactory(PhoneFactory)生产ConcreteProduct(Phone),我们实现了创建和使用的分离,隐藏了生产产品的细节。现在如果我们想要拓展DigitalDevice,加入Pad类和生产PadFactory类,那么我们无需修改之前的代码。在测试Pad的时候只需要将构造对象改为 new PadFactory即可。


工厂方法的潜在缺点有:

  • 可能仅仅为了创建一个特定的ConcreteProduct对象,而不得不创建一个Creator子类
  • 重构已存在的类可能会破坏客户端代码

另外,可能还有很多人觉得工厂方法和抽象方法何其相似,这里引用 cjjky 的一张图片,说明一下两者的区别:

这里我们先看看两个概念:产品族和产品等级。

         产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:


参考文献

1.维基百科:工厂方法

2.设计模式:可复用面向对象软件的基础

3.工厂方法模式(Factory Method)(一)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值