通过《西游记》学习设计模式--工厂方法
是不是在面试等一些场景时,会被问到涉及模式呢?让你详细讲的时候,你却不知怎么描述,因为这里面涉及23种涉及模式,靠死记硬背当时是记得很清楚,但是时间一久就忘得差不多了,今天让我用故事的方式给你理一下设计模式吧。
首先,你没猜错,我们讲的是工厂方法。我们用《西游记》孙悟空借兵器的故事来阐述工厂方法设计模式。
开始故事:
美猴王学成本领归来,唯独缺少一件兵器,这时候牛魔王告诉孙悟空东海龙王有很多上好的兵器,可以去东海龙宫讨一件趁手的兵器。
孙悟空其实并不确定什么样的兵器适合自己,向东海龙王索要趁手的兵器,于是前后试了大刀、双锤、九股钢叉等兵器,结果都不满意,最后东海龙王无奈,祭出大杀器--如意金箍棒,并讲述这是当年大禹治水留下的神铁,最终孙悟空最终得到了满意的武器。
1、故事中的角色
接下来我们开始梳理一下整个故事中,涉及到和工厂方法相关的组件:
东海龙王------兵器工厂(负责提供兵器)
孙悟空 ----------获得金箍棒的具体工厂
如意金箍棒----具体的产品(兵器的一种)
三者之间的关系图如下:
2、抽象化分析方法
东海龙王拥有大量的兵器
不同的人有不同的兵器最为趁手
如意金箍棒是龙王压轴的兵器
孙悟空最趁手的就是如意金箍棒
抽象化后的关系图如下图
3、工厂方法的静态建模
在上图中,涉及到了几个内容:
东海龙王---抽象工厂(IWeaponFactory)
各类兵器---抽象产品(AbstractWeapon)
孙悟空----具体工厂(WukongFactory)
金箍棒----具体产品(Jingubang)
4、故事情节的工厂方法的模拟实现
/**
* 兵器抽象工厂
*/
public interface IWeaponFactory {
AbstractWeapon getWeapon();
}
/**
* 抽象产品
*/
@Data
public abstract class AbstractWeapon {
/**
* 兵器名称
*/
private String name;
public AbstractWeapon(){
}
}
/**
* 具体产品--金箍棒
*/
public class Jingubang extends AbstractWeapon {
public Jingubang(){
this.setName("如意金箍棒");
}
}
/**
* 悟空工厂,具体的工厂
*/
public class WukongFactory implements IWeaponFactory {
@Override
public AbstractWeapon getWeapon() {
return new Jingubang();
}
}
/**
*验证趁手的兵器是什么
*/
public class App
{
public static void main( String[] args)
{
IWeaponFactory factory =new WukongFactory();
AbstractWeapon weapon = factory.getWeapon();
System.out.println("孙悟空获得的趁手兵器是:"+weapon.getName());
}
}
如果悟空工厂暂时无法工作了,这时候八戒工厂开着,八戒工厂里产九齿钉耙,如下:
/**
* 具体产品--九齿钉耙
*/
public class Jiuchidingpa extends AbstractWeapon {
public Jiuchidingpa(){
this.setName("九齿钉耙");
}
}
/**
* 八戒工厂,具体的工厂
*/
public class BajieFactory implements IWeaponFactory {
@Override
public AbstractWeapon getWeapon() {
return new Jiuchidingpa();
}
}
这时候孙悟空去的话,过程如下:
public class App
{
public static void main( String[] args)
{
//IWeaponFactory factory =new WukongFactory();
IWeaponFactory factory =new BajieFactory();
AbstractWeapon weapon = factory.getWeapon();
System.out.println("孙悟空获得的趁手兵器是:"+weapon.getName());
}
}
结果是:
总结:
在工厂方法中,存在这样几种角色
1、抽象工厂
2、抽象产品
3、具体工厂
4、具体产品
可以理解为:
抽象工厂生产抽象产品
具体工厂生产具体产品