美文网首页
工厂模式(2)简单工厂模式下篇

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

作者: 疯狂的JAVA | 来源:发表于2018-12-11 15:16 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:工厂模式(2)简单工厂模式下篇

          本文链接:https://www.haomeiwen.com/subject/xdfehqtx.html