一、概述
工厂方法(Factory Method)又叫虚拟构造(Virtual Constructor)或者多态工厂(Polymorphic Factory)。核心概念在于定义一个创建对象的接口和一个抽象对象基类,但由其子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
工厂方法的结构是由四个角色组成:抽象工厂、具体工厂、抽象产品、具体产品。抽象工厂是工厂方法模式的核心,在模式中任何创建对象的工厂类都必须实现抽象工厂接口;具体工厂即实现了抽象工厂接口的具体工厂类;抽象产品是所创建的产品对象的超类型,即具体产品对象的共同父类或共同实现的接口;具体产品是指实现了抽象产品接口或继承抽象产品类的产品类。
二、示例
现在假设,蛋糕店有两个糕点师Jerry和Tom,Jerry的拿手糕点是草莓蛋糕,而Tom却擅长做巧克力蛋糕。。那现在我们就可以利用工厂方法模式让糕点师们为我们做他们拿手的蛋糕,代码如下:
- 定义抽象蛋糕师接口:
public interface CakeMaker{
Cake makeCake();
}
- 定义抽象蛋糕接口:
public interface Cake{
String display();
}
- 请两个糕点师登场
class Jerry implements CakeMaker{
@Override
public Cake makeCake(){
return new StrawberryCake();
}
}
class Tom implements CakeMaker{
@Override
public Cake makeCake(){
return new ChocolateCake();
}
}
- 最后是两个类型的蛋糕
class StrawberryCake implements Cake{
@Override
public String display(){
return "This is a strawberry cake!";
}
}
class ChocolateCake implements Cake{
@Override
public String display(){
return "This is a chocolate cake";
}
}
- 现在可以让他们开始做了
public class Test{
public static void main(String[] args){
// 来一个草莓蛋糕
CakeMaker Jerry = new Jerry();
Cake strawberryCake = Jerry.makeCake();
System.out.println(strawberryCake.display());
// 再来一个巧克力草莓
CakeMaker Tom = new Tom();
Cake chocolateCake = Tom.makeCake();
System.out.println(chocolateCake.display());
}
}
三、总结
- 工厂方法的核心在于把工厂和产品进行抽象,把具体的实例化逻辑交由实现类,即将任务延迟到子类中去完成;
- 添加新的功能模块,无须修改接口,满足开闭原则;
- 阻断了调用方与具体实现逻辑的依赖关系,提高了系统的可扩展性,符合迪米特原则。