工厂模式(3)方法工厂模式

         前言:经过前篇文章的学习,大家应该形成一种潜意识,那就是不管什么设计模

式,它的核心目的是为了解决开发中遇到的问题。完美的解决问题则需要遵循一些原则

比如开闭原则、单一原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则

和合成复用原则,一句话设计模式为了程序的扩展性好,易于维护和升级。


        开发就像打仗一样,如果双方实力一样最开始会硬钢,但是如果一边人少还想赢

得战争只能想套路了,于是就有了《孙子兵法》《三十六计》,书里面告诉了我们应

该用什么计谋应对特定的情况,比如《三十六计》就有胜战计、敌战计、攻战计、混

战计、并战计、败战计,其实更多的时候是多种计谋一起使用,比如王允使用美人计

+连环计巧杀董卓。学习更多设计模式之后你还会面临设计模式选择的问题,比如金蝉

脱壳和走为上策有什么区别,关于这些就属于设计模式高深的内容了,请持续关注我

们设计模式后续的内容。。。



工厂模式(3)方法工厂模式_第1张图片

       

          问题描述:上次小张使用简单工厂模式完美的解决了埃及猫与波斯猫的创建问

                             题,而且小张感觉自己的代码是可以完美扩展的.



      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、如果产品太多不应该让一个工厂处理所有的创建,这会让这个工厂类变的

                       臃肿而增加控制成本,比如你不能依靠一个工厂创建奔驰的跑车和商务

                       车,而应该多个工厂各司其职


         小张意识到这个问题之后于是将代码修改如下


public class TestMethodFactory {

           public static void main(String[] args) {

                      //向工厂模式传参并创建对象

                     CatFactory factory = new EgyptCatFactory();

                     //创建猫对象

                     Cat cat = factory.create();

          }

}

interface Cat {

}

interface CatFactory {

            public Cat create();

}

class EgyptCat implements Cat {

          public void run() {

                      System.out.println("EgyptCat.run()");

         }

}


class EgyptCatFactory implements CatFactory {

           @Override

           public Cat create() {

                      return new EgyptCat();

           }

 }


class PersianCat implements Cat {

            public void run() {

                      System.out.println("PersianCat.run()");

             }

}


class PersianCatFactory implements CatFactory {

            @Override

            public Cat create() {

                        return new PersianCat();

            }

}


         通过对上述代码的观察,我们大概可以发现两件事情


                1、核心工厂类不会被别人修改,以后无论增加什么子类,只需要创建子类并

                     创建子类的工厂类即可


                2、以后每个对象创建都会由自己的工厂类实现,即使创建过程再复杂也不会

                      对别人的代码产生干扰,而且分工明确,扩展性极好


          以上两点就是方法工厂模式的核心思想


工厂模式(3)方法工厂模式_第2张图片


            天要下雨需求要变是阻拦不了的,现在宠物医院规模变大,增加了小狗类和小猫

 类,而且还分为观赏型和运动型宠物,将来有可能还会把老鼠加进来,那么你感觉这会给

小张的开发带来什么难点呢? 请继续关注我们后续的文章《工厂模式(4)抽象工厂模式》

你可能感兴趣的:(工厂模式(3)方法工厂模式)