设计模式2-工厂模式

工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式。下面将依次介绍各个工厂模式

1.简单工厂模式

首先说说简单工厂模式,我用现实中的汽车工厂举例子,首先有个汽车类的接口叫做Car,里面有个开车的方法叫做drive(),然后有个吉利车的类叫做Jili,实现了car的接口,还有个奇瑞车的类叫做Qirui,也实现了Car的接口(因为都是车嘛,当然能开了)。

       interface Car{
            public void drive(){
                     System.out.println("我开车");
            }
       class Jili implements Car{
            public Jili(){
                     System.out.println("生产一台吉利车");
            }
            pulic void drive(){
                     System.out.println("我开吉利车");
            }
      }
      class Qirui implements Car{
            public  Qirui(){
                     System.out.println("生产一台奇瑞车");
            }
            pulic void drive(){
                     System.out.println("我开奇瑞车");
            }
      }

那现在如果我要用Jili这个类,最基本的方式就是

     Jili jili=new Jili();

如果用Qirui这个类,最基本的方式也是

      Qirui qirui=new Qirui();

哦,那现在如果有个比亚迪车就得new Biyadi();然后同样有个drive()的方法,这样每个都得new个汽车对象,但是其实吉利,奇瑞和比亚迪他们都属于汽车,同样都有drive()方法,那是不是我们能创建一个生产汽车的工厂,然后你想要什么汽车只要告诉工厂就可以,工厂就帮你生产了,这样你不用管生产的细节工作(也就是new对象的过程),这样会更好呢,到此,简单工厂模式就出来了,简单工厂模式就是创建具有相同特征的类的实例,然后把创建汽车的方法静态化,这样就可以直接用工厂生产了,代码如下

     class CarFactory{
             public static Car createCar(String carname){
                  if("jili".equals(carname)){
                        return new Jili();
                  }else if("qirui".equals(carname)){
                        return new Qirui();
                  }else if("biyadi".equals(carname)){
                        return new Biyadi();
                  }
            }

这就ok了,这样如果你要生产出一台汽车,直接调用Car car=CarFactory.createCar(“jili”);就可以了。
总结

简单工厂实际上简单工厂模式就是**创建具有相同特征的类的实例**,然后把创建汽车的方法静态化。也就是将new相同的实例通过工厂管理起来,使用的时候告诉工厂需要什么实例即可。以后需要添加新的实例,只需要在工厂中制作。修改也只需要修改工厂的方法。   

这种工厂虽然挺好,但是如果我每次要加入一个新车都得修改工厂类来加入新的判断语句,这样不符合开闭原则,所以慢慢人们又想出一种更加好的生产方式,这就是工厂方法模式。

2.工厂方法模式

首先我们把生产汽车的工厂类抽象出来当成一个接口,

        Interface CarFactory{
            public static Car createCar();
         }
     然后呢,让具体工厂类实现这个生产汽车的接口,这样就会有三个具体工厂,一个是吉利车生产工厂,一个是奇瑞车生产工厂,一个是比亚迪车生产工厂
    class JiliFactory  implements CarFactory{
            public static Car createCar(){
                  return new Jili();
            }
         }
    class QiruiFactory  implements CarFactory{
         public static Car createCar(){
               return new Qirui();
         }
      }
    class BiyadiFactory  implements CarFactory{
         public static Car createCar(){
               return new Biyadi();
         }
      }
 这样做的好处就是如果我还要生产一个长城汽车,不用去修改CarFactory这个工厂,只需要再写个长城工厂类去实现CarFactory这个接口就可以了。这就是工厂方法模式,不过工厂方法模式和简单工厂模式的各有优点,也不能就说工厂方法模式就好,关键在于看实际情况去决定用哪种模式。

3.抽象工厂模式:

车的接口和类就定义好了,相信大家也理解什么是产品族了,下面我们该看工厂怎么实现了,首先还是向工厂方法模式那样,有个生产汽车的工厂接口,不过我们对这个接口进行了一些扩充,因为Car类分成了跑车和越野车,所有我们接口也就是能生产出跑车和越野车这两种车型

     Interface CarFactory{
            public static PaoChe createPaoChe();

            public static YueyeChe createYueyeChe();
         }

和工厂方法一样我们需要两个真正的工厂类来生产真正的汽车,恩…..当然,吉利工厂可以生产吉利跑车和吉利越野车,奇瑞工厂可以生产奇瑞跑车和奇瑞越野车,代码如下

    class JiliFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new JiliPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new JiliYueyeChe();
            }
         }
         class QiruiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new QiruiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new QiruiYueyeChe();
            }
         }  

ok了,抽象工厂模式也完成了,大家如果想生产一个吉利跑车,就可以JiliFactory.createPaoChe();这样吉利跑车就出来了,不错吧,同理如果我们还要一个比亚迪的汽车工厂只要实现CarFactory这个工厂就行了,代码如下

    class BiyadiFactory  implements CarFactory{
            public static PaoChe createPaoChe(){
                  return new BiyadiPaoChe();
            }
            public static YueyeChe createYueyeChe(){
                  return new BiyadiYueyeChe();
            }
         }

特别感谢:http://www.cnblogs.com/dixinyunpan/p/5866999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值