一、介绍
相对于简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
二、案例
依然采用模拟手机制造举例说明:
- 手机制造标准
/**
* 手机制造标准
*
* @author zhangxs
**/
public interface Phone {
void make();
}
- 苹果手机具体制造实现
/**
* 苹果手机
*
* @author zhangxs
**/
public class ApplePhone implements Phone {
public ApplePhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造苹果手机...");
}
}
- 华为手机具体制造实现
/**
* 华为手机
*
* @author zhangxs
**/
public class HuaweiPhone implements Phone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造华为手机...");
}
}
- 小米手机具体制造实现
/**
* 小米手机
*
* @author zhangxs
**/
public class XiaomiPhone implements Phone {
public XiaomiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造小米手机...");
}
}
- 抽象手机工厂
/**
* 抽象手机工厂
*
* @author zhangxs
**/
public interface PhoneFactory {
Phone makePhone();
}
- 生产苹果手机的工厂
/**
* 苹果手机代工厂
*
* @author zhangxs
**/
public class AppleFactory implements PhoneFactory {
@Override
public Phone makePhone() {
return new ApplePhone();
}
}
- 生产华为手机的工厂
/**
* 华为手机代工厂
*
* @author zhangxs
**/
public class HuaweiFactory implements PhoneFactory {
@Override
public Phone makePhone() {
return new HuaweiPhone();
}
}
- 生产小米手机的工厂
/**
* 小米手机代工厂
*
* @author zhangxs
**/
public class XiaomiFactory implements PhoneFactory {
@Override
public Phone makePhone() {
return new XiaomiPhone();
}
}
- 测试
/**
* 测试
*
* @author zhangxs
**/
public class Test {
public static void main(String[] args) {
PhoneFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.makePhone();
PhoneFactory appleFactory = new AppleFactory();
appleFactory.makePhone();
PhoneFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.makePhone();
}
}
三、总结
- 优点:
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。 - 缺点:
1、类的个数容易过多,增加复杂度
2、增加了系统的抽象性和理解难度
3、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。 - 适用场景:
1、客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
2、创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
3、客户不关心创建产品的细节,只关心产品的品牌