定义
定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。(定义来源百度)
模式的角色与类图
学设计模式个人觉得当说到一个模式时,脑子中立刻可以浮现出对应的角色和类图是非常有必要的。
角色
相对于简单工厂多出了一个接口,具体角色如下:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
类图
具体代码如下:
/**
* @author hao
* 抽象产品接口
*/
public interface Phone {
String getName();
void call();
}
/**
* @author hao
* 具体产品1
*/
public class HuaweiPhone implements Phone{
@Override
public String getName() {
return "华为手机";
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
/**
* @author hao
* 具体产品2
*/
public class XiaomiPhone implements Phone {
@Override
public String getName() {
return "小米手机...";
}
@Override
public void call() {
System.out.println("小米手机打电话...");
}
}
/**
* @author hao
* 抽象工厂
*/
public interface PhoneFactory {
Phone createPhone();
}
/**
* @author hao
* 具体工厂1
*/
public class HuaweiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
}
/**
* @author hao
* 具体工厂2
*/
public class XiaomiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
}
我们使用测试代码进行测试,测试类代码如下:
public class MainTest {
public static void main(String[] args){
PhoneFactory pf = new XiaomiPhoneFactory();
Phone xmphone = pf.createPhone();
System.out.println(xmphone.getName());
xmphone.call();
PhoneFactory hwpf = new HuaweiPhoneFactory();
Phone hwpfPhone = hwpf.createPhone();
System.out.println(hwpfPhone.getName());
hwpfPhone.call();
}
}
测试结果如下:
小米手机…
小米手机打电话…
华为手机
华为手机打电话
优缺点分析
优点
符合开闭原则,新增产品时无需修改工厂类代码,只需新增一个产品的实现工厂。
缺点
新增一个产品就新增一个工厂类,会增加系统的复杂度。
Spring框架的就是使用该模式来生产bean的。具体的SpringIOC的原理会在后面的文章中分析到。