简介
- 工厂方法模式:在一个类中定义一个抽象方法,让这个类的子类去实现,返回具体的产品对象。
应用场景
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望有它的子类来指定创建具体的对象的时候。
- 当类创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理这一信息局部化的时候。
意图
- 定义一个创建对象的接口方法,让其子类决定实例化哪一个类。换句话说使得一个类的实例化延迟到其子类。
参与者
- Product:定义工厂方法所创建对象的接口
- ConcreteProduct:实现Product接口
- Creator:定义工厂方法,该方法返回一个Product对象。
- ConcreteCreator:Creator的子类,重新定义Creator的工厂方法,返回具体的产品对象
结构
协作
- Creator依赖于它的子类定义工厂方法,使用它返回一个抽象产品对象。具体什么什么产品,需要它的子类去创建。
效果
- 使得一个类的实例化延迟到其子类
实例
场景:电脑工厂,生产苹果电脑,联想电脑产品,
(1)产品类
/**
* 电脑类
* Created by shixinshan on 2018/10/25.
*/
public class Computer {
public String name;
}
(2)具体的电脑类:苹果电脑
public class MacBook extends Computer {
public MacBook(String name) {
this.name = name;
}
}
(3)具体的电脑类:联想电脑
public class ThinkPadCreator extends Creator {
@Override
public Computer getProduct() {
return new MacBook("ThinkPad");
}
}
(4)工厂方法类
public abstract class Creator {
public abstract Computer getProduct();//工厂方法
}
(5)工厂方法实现类
苹果电脑工厂实现
public class MacCreator extends Creator {
@Override
public Computer getProduct() {
return new MacBook("macbook");
}
}
联想电脑工厂实现
public class ThinkPadCreator extends Creator {
@Override
public Computer getProduct() {
return new MacBook("ThinkPad");
}
}
测试
@Test
public void factoryMethod() throws Exception {
Creator creator = new MacCreator();
Computer computer = creator.getProduct();
System.out.println("computer :"+computer.name);
Creator thinkPadCreator = new ThinkPadCreator();
Computer product = thinkPadCreator.getProduct();
System.out.println("computer :"+product.name);
}
结果
computer :macbook
computer :ThinkPad
Process finished with exit code 0