工厂模式(2)简单工厂模式下篇

2018-12-11  本文已影响0人  疯狂的JAVA

         前言:今天我们一起来学习一种简单而且又有逼格的技术,设计模式中的工厂模

式。虽然工作的时候我们使用的框架都是封装好的,直接参考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

上一篇 下一篇

猜你喜欢

热点阅读