前言:今天我们一起来学习一种简单而且又有逼格的技术,设计模式中的工厂模式。虽然工作的时候我们使用的框架都是封装好的,直接参考API写代码就Ok了,但是总有一些公司美其名曰要考察面试者的基
本功,于是就会问问设计模式或者算法,框架源码。其实没有那个公司想着让自己的公司员工成为大牛,原因也很简单你的技术牛了肯定想要更高的工资,公司不想支付高工资又会导致员工跳槽。
问题描述:公司开发一个宠物管理系统,项目经理让小张写一个波斯猫的类,后面业务需求发生更改,在创建对象的时候需要初始化name属性,于是所有调用波斯猫创建类的代码都需要发生修改,于是小张
把对象的创建交给了波斯猫的工厂,完美的解决了这个问题,但是新的问题又来了,项目经理告诉小张添加一个埃及猫类,小张开始写代码.
public class TestNoFactory { public static void main(String[] args) { PersianCat persianCat = new PersianCat(); EgyptCat egyptCat = new EgyptCat(); } }
class EgyptCat { public void run() { System.out.println("EgyptCat.run()"); } }
class PersianCat { public void run() { System.out.println("PersianCat.run()"); } }
|
在代码省略掉工厂情况下,小张的代码面临着两个问题:
1、需要对猫类进行抽象出一个父类或者父接口,因为别的同事写的代码所有涉及到波斯猫作为参数传递的时候都需要用埃及猫重载,如果两种猫还好,如果数量大到一定程度,工
作量也大到无法想象,这个时候需要传入这些类的父类
2、别的同事创建猫对象只需要创建父类对象即可,那么用户调用创建方法并传入猫的种类,通过工厂模式自动返回创建好的对象即可.
小张意识到这个问题之后于是将代码修改如下:
public class TestEasyFactory { public static void main(String[] args) { //向工厂模式传参并创建对象 Cat cat = CatFactory.create(CatType.PersianCat); } }
class CatFactory { public static Cat create(CatType type) { Cat cat = null; //判断猫的类型创建对象 if (CatType.PersianCat == type) { cat = new PersianCat(); } else if (CatType.Egypt == type) { cat = new EgyptCat(); } return cat; } }
interface Cat {
}
class EgyptCat implements Cat { public void run() { System.out.println("EgyptCat.run()"); } }
class PersianCat implements Cat { public void run() { System.out.println("PersianCat.run()"); } }
enum CatType { PersianCat, Egypt } |
通过对上述代码的观察,我们大概可以发现两件事情:
1、提前对同一类事物进行抽象,将来即使添加别的子类也可以继续使用
2、工厂创建的对象的返回值为同一类型的父类,根据传入的类型判断创建具体子类对象,这也是OOP的体现,而且还可以在父类或者父接口中定义让子类必须实现的抽象方法,
以上两点就是简单工厂模式的核心思想。
作为一个好的魔术师你永远不知道他会从箱子里拿出什么变成什么,可怕的是客户是最好的魔术师,于是客户说增加需求了,我们需要将猫的种类再添加五种,那么你感觉这会给小张的开发带来什么难点呢?
请继续关注我哦
下集预告:《工厂模式(3)方法工厂模式》