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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,772评论 0 14
  • DAY 05 1、 public classArrayDemo { public static void mai...
    周书达阅读 734评论 0 0
  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,382评论 1 31
  • 翠萍这个人思想观念特别传统,而且老公家人特别重男轻女,为了能让自己顺利怀孕并生下男孩,翠萍没少烧香拜佛。一年后翠萍...
    ecab052901aa阅读 243评论 0 0
  • 不可否认的是,无论什么时候,功利主义总是存在的,功利主义原本就是一种哲学主张,哲学范畴的功利主义,也称效益主义,是...
    凌宗伟阅读 698评论 1 1