概述:
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品 。
类图:
角色:
抽象工厂角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
实例:
我们平常用的手机有各个品牌,苹果,小米,华为等等。同样它们也都是被不同的厂家生产出来,富士康,比亚迪等等。
我们假设不同品牌的手机除了手机参数不同以外,其他的贴膜、测试、体验等环节都一样。
我们可以首先定义一个抽象产品角色。
public abstract class Phone {
//手机型号
protected String model;
//手机尺寸
protected Double size;
//颜色
protected String color;
void film(){
System.out.println("贴膜");
}
void test(){
System.out.println("测试");
}
void experience(){
System.out.println("体验");
}
}
我们定义不同品牌的手机,也就是具体产品角色。
public class Iphone extends Phone{
public Iphone() {
model = "苹果12";
size = 6.5;
color = "蓝色";
}
}
public class MiPhone extends Phone{
public MiPhone() {
model = "小米10";
size = 5.5;
color = "银色";
}
}
因为手机除了参数不同以外,别的步骤都一样,所以我们把这些相同的步骤抽出来,放到工厂里面。
我们定义一个抽象工厂角色
public abstract class PhoneFactory {
public Phone production(String type){
Phone phone = createPhone(type);
phone.film();
phone.test();
phone.experience();
return phone;
}
public abstract Phone createPhone(String type);
}
具体工厂——富士康工厂
public class FoxconnFactory extends PhoneFactory{
@Override
//富士康生产手机
public Phone createPhone(String type) {
if(type.equals("MiPhone")){
return new MiPhone();
}
else if(type.equals("Iphone")){
return new Iphone();
}
return null;
}
}
我们写一个客户端来测试一下
public class Client {
public static void main(String[] args) {
//具体的富士康工厂
PhoneFactory phoneFactory = new FoxconnFactory();
Phone miPhone = phoneFactory.production("MiPhone");
System.out.println(miPhone.model+miPhone.color+miPhone.size);
}
}
输出:
贴膜
测试
体验
小米10银色5.5