定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推辞到子类。
类型:
创建型
适用场景:
创建对象需要大量重复的代码
一个类通过其子类来指定要创建的对象
优点:
加入新产品不需要修改代码,提高了可扩展性
客户无需关注细节,只需关心所对应产品工厂
缺点:
类的个数容易过多增加复杂度
增加系统抽象与理解难度
添加产品时,还需要添加具体的工厂类
代码实现
首先要生产的产品类
如生产手机,定义各个手机厂商的手机产品类即可
首先定义一个手机接口Phone.java(目的是对各个手机产品形成规范,对外提供统一的接口)
<code>interface Phone {
public void produce();
}/<code>
定义具体产品并实现Phone接口
HuaweiPhone.java 华为手机
<code>public class HuaweiPhone implements Phone {
@Override public void produce() {
System.out.println("生产华为手机");
}
}/<code>
Iphone.java
苹果手机<code>public class Iphone implements Phone{
@Override public void produce() {
System.out.println("produce iphone");
}
}/<code>
定义PhoneFactory.java 产品工厂
<code>public abstract class PhoneFactory {
public abstract Phone makePhone();
}/<code>
将创建对象延迟到子类
HuaweiPhoneFactory.java 华为手机工厂
<code>public class HuaweiPhoneFactory extends PhoneFactory{
@Override public Phone makePhone() {
return new HuaweiPhone(); }
}/<code>
IPhoneFactory.java 苹果手机工厂
<code>class IPhoneFactory extends PhoneFactory{
@Override public Phone makePhone() {
return new Iphone(); }
}/<code>
客户端调用
<code>public class Client {
public static void main(String[] args) {
PhoneFactory phone =new HuaweiPhoneFactory();
phone.makePhone().produce();
}
}/<code>
可以看到客户端调用时只需要调用具体的工厂即可,修改时改变工厂即可。我们只需要关心具体的工厂而不需要关心其内部实现。同时也符合了开闭原则(不修改工厂内部的源码实现)。
UML类图
閱讀更多 狂熱知識分子 的文章