前言:今天我们一起来学习一种简单而且又有逼格的技术,设计模式中的工厂模
式。虽然工作的时候我们使用的框架都是封装好的,直接参考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)方法工厂模式》
热门推荐: 一种简单且又有逼格的技术 https://www.jianshu.com/p/3d9c3902d78a
线程不安全? https://www.jianshu.com/p/24c4508d971f
著名的Log4j 是怎么来的 https://www.jianshu.com/p/7407e44ed702
网友评论