一. 简介
工厂方法是一种创建设计模式,用于在超类中创建对象,允许子类更改将创建的对象类型。
二.引入
想象你开发了一个生成女朋友的应用,一开始的时候你只想自己觉得好看,于是只考虑了萝莉的版本,没想到你的应用一下火了起来. 这时候有很多LSP不满意了,给你留言说你这应用咋没法生成御姐啊,让你赶紧加上,否则给你差评. 这时候由于你的代码已经与萝莉类耦合,你只能改变你的萝莉类,加上御姐的代码.试想随着越来越多的人使用你的应用,以后可能会有各种意料之外的要求,此时如果一直在萝莉类上改动会让认抓狂
三.解决方法
此时,工厂方法就可以派上用场.你可以使用特定的工厂方法替代原来的new 对象的方法.
猛一看这貌似啥用也没有,因为只是把创建对象从 new 变成了在别的类内部.
但是!!!
此时你只需要创建一个 公共接口,就可以让你的女朋友随你心意变
四.上代码
一个女朋友的接口
public interface Couple{
//通知生成方法
void appear();
//一个哄开心方法
void pamper();
//一个睡觉方法
void sleep();
}
萝莉实现类
public class Luoli implements Couple {
@Override
public void appear() {
System.out.println("小萝莉出来啦");
}
@Override
public void pamper() {
System.out.println("小萝莉在你怀里撒娇");
}
@Override
public void sleep() {
System.out.println("小萝莉睡着了 zzzzz~");
}
}
一个女朋友生成器
public abstract class CoupleFactory{
public void apper() {
Couple couple= createCouple();
couple.appear();
}
public abstract Couple createCouple();
}
一个萝莉工厂
public LuoliFactory extends CoupleFactory{
@Override
public Button createCouple() {
return new Luoli();
}
}
如果你愿意,你甚至可以生成个坤坤当女朋友
public class KunKun implements couple{
//一个通知生成方法
public void appear(){
System.out.println("坤坤打着篮球出来啦");
}
//一个哄开心方法
public void pamper(){
System.out.println("坤坤给你唱rap");
}
//一个睡觉方法
public void sleep(){
System.out.println("坤坤睡着了 zzzzz~");
}
一个坤坤工厂
public KunKunFactory extends CoupleFactory{
@Override
public Button createCouple() {
return new KunKun();
}
}
运行试试看
public class Main {
public static void main(String[] args) {
// LuoliFactory luoliFactory = new LuoliFactory();
// luoliFactory.appear();
// Couple luoli = luoliFactory.createCouple();
// luoli.pamper();
// luoli.sleep();
KunKunFactory kunKunFactory = new KunKunFactory();
Couple kunkun = kunKunFactory.createCouple();
kunkun.appear();
kunkun.pamper();
kunkun.sleep();
}
}
结果
坤坤打着篮球出来啦
坤坤给你唱rap
坤坤睡着了 zzzzz~
五.优缺点总结
优点 :
- 代码解耦
- 符合单一职责原则,使代码更好支持和维护
- 符合开闭原则. 你可以在不修改代码的情况下扩展它
缺点:
- 本来我就想要一个对象的话,却因为使用工厂方法,写了一大堆对象,大大增加了代码的复杂度,因此它仅仅适用于你想生成同一类的多个不完全相同对象时