工厂模式介绍

工厂模式一共分为:

简单工厂模式   又称静态工厂模式

工厂方法模式   又称多态工厂模式 polimorphic factory

抽象工厂模式   又称工具箱模式

 

 

 

下面通过  女娲捏土造成 来说明:

 

1.简单工厂模式

 

这个模式的问题是 :部分满足 开放封闭原则。只要再造一种新人,不如人妖。那就得修改女娲那个类。累死女娲

 

体现在代码里就是:

 

女娲类的核心是:

switch(type){

     case '男人':  。。。;

     break;

 

      case '女人':。。。;

     break;

 

       default

            break;

}

当玉环大帝说,造个人妖吧,女娲类就得修改成

switch(type){

     case '男人':  。。。;

     break;

 

      case '女人':。。。;

     break;

 

     case '人妖‘:。。。;

      break;

 

     default

            break;

}

 

这样就只是部分地满足了 开放封闭原则:对扩展开放,对修改封闭。

 

 

 

 

2.工厂方法模式

能完全满足开放封闭原则。

通过抽象出 女娲类。

 

就好比:女娲说,我自己也亲自去造人了,谁要造人就从我这拿绳。

           造女人,就拿阴绳;造男人,就拿阳绳;如果某天要造人妖,就拿阴阳绳吧

体现在代码里就是:

      public interface 女娲(){

          public 人 造人();

   }

 

   具体的女娲就是实现上面的接口:

      public class 造男人女娲 implements 女娲(){

              public 人 造人(){

                     return   ’男人‘;

               }

     }

 

       public class 造女人女娲 implements 女娲(){

              public 人 造人(){

                     return   ’女人‘;

               }

     }

 

     实际在 造的时候就是:

          女娲 nw_man = new 造男人女娲();

         nw_man.造人(); //这样造出来的就是男人。  这就是多态。一种对象的多种形态。女娲有造男人的女娲,造女人的女娲。。。

 

   多态的条件有三个: 有继承,有重写, 子类实例指向引用

 

所以工厂方法模式也叫多态工厂模式!!!

 

实际有一次在项目中式通过配置文件来实现的。通过修改配置文件,会更加方便。不过要用到反射。具体的代码,回去再研究研究

 

三:抽象工厂方法

    面对的情形是: 产品族,要增加一类产品族。

 

一个经典的,很能说明问题的例子是:

我有一个制作工厂,现在的业务是承接PC机的RAM和CPU的生产,还承接MAC机的RAM和CPU的生产。

 

在这里MAC机的RAM和CPU就叫做一个产品族。

 

那代码设计应该是怎么样的呢?

有多少种产品族,就有多少个抽象的工厂。

 

比如现在是2个产品族,PC机的和MAC机的。

 

最顶级的抽象接口是:

//抽象工厂角色

  public interface ComputerProducer   {  //功能很明白,就是我们厂子就生成CPU和RAM

       Cpu createCpu();

     Ram createRam();

  }

//

  //两个具体工厂角色   

     public class PcProducer implements ComputerProducer   { //生成PC配件的工厂 

                 public Cpu createCpu()   {   return new PcCpu();   }

               public Ram createRam()   {   return new PcRam();   }   

 

   }  

 

 public class MacProducer implements ComputerProducer   {   //生产Mac配件的工厂

                  public Cpu createCpu()   {   return new MacCpu();   }

              public Ram createRam()   {   return new MacRam();   }

  }

 

里面具体的产品类是:

 

公司承接的2中配件:

//两个抽象产品

  public interface Cpu   {   }//生产cpu  

      public interface Ram   {  }//生成ram

 

然后具体的产品就可以实现上面的接口:

   //四个具体产品

  public class PcCpu implements Cpu   {   }      

      public class PcRam implements Ram   {   }   

 

      public class MacRam implements Ram   {  }

      public class MacCpu implements Cpu   {   }

 

客户来了,那么:

      ComputerProducer  工厂1 = new PCProducer();//那么工厂1生成出来的cpu和RAM都是PC机上的

      ComputerProducer  工厂2 = new MACProducer();//那么工厂2生成出来的cpu和RAM都是MAC机上的

 

     工厂1.createCpu();  //这就是生产PC的CPU。

 

 

如果此时,火星机的RAM和CPU也找到我们厂子来生成。那么很简单:

来一个火星机具体工厂

    public class 火星Producer implements ComputerProducer   { //生成火星机配件的工厂 

                 public Cpu createCpu()   {   return new PcCpu();   }

               public Ram createRam()   {   return new PcRam();   }   

 

   }  

 

具体 的产品再加2个:

    public class 火星Cpu implements Cpu   {   }       

     public class 火星Ram implements Ram   {   }  

 

 

然后

      ComputerProducer  工厂3 = new 火星Producer();//那么工厂3生成出来的cpu和RAM都是火星机上的

 

 

方便吧。其实女娲的故事也可以用进来,看下图:

 

 

终极总结:

 

      1.简单工厂,就是在工厂类里switch。什么具体的事情都放在工厂类里来做;  一有新产品要做,就要修改工厂类

                         所以只是部分满足   开放封闭原则;

      2. 工厂方法, 把工厂类抽象出来,然后继承具体的工厂。如果新产品来了,就再继承出一个新的产品工厂。

                         完全满足 开放封闭原则。

        3. 抽象工厂方法  面对的是产品族的情况。新增加一个产品族,可以在满足开放封闭原则的情况下实现。

                                但是如果新增一个产品,那就得破坏开放封闭原则了。

 

 

再借鉴下别人的总结:

 

简单工厂:用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

 

 

好的。谢谢地球。加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值