Java开发中常用的设计模式(一)—工厂形式

  以汽车工厂为例,首先有个汽车类的接口 Car,里面有个发车的点子
drive(),然后有个路特斯车的类 BMW 和劳斯莱斯车的类 Benz 实现了 Car 接口。

图片 1图片 2

public interface Car{
    public void drive();
}

public class BMW implements Car{
    public BMW(){
        System.out.println("生产一台宝马车");
    }

    public void drive(){
        System.out.println("我开宝马车");
    }
}

public class Benz implements Car{
    public Benz(){
        System.out.println("生产一台奔驰车");
    }

    public void drive(){
        System.out.println("我开奔驰车");
    }
}

View Code

    现在一旦要用 BMW 这多少个类,最核心的艺术是:BMW bmw = new
BMW();  尽管还要个 Benz 类,就得:new Benz();

  这样各类都得 new 个汽车对象,不过英菲尼迪和宝马都属于汽车,都有 drive()方法;这我们是不是能创设一个生育汽车的工厂,

  然后想要什么汽车告诉工厂,工厂帮你生产就足以了,而不用管生儿育女的底细(也就是
new 对象的进程),这样会更好吧?

  到此,简单工厂情势就出去了。

 

一. 简单工厂情势

图片 3图片 4

public class CarFactory{
    public static Car createCar(String carName){
        if("BMW".equals(carName)){
            return new BMW();
        }else if("Benz".equals(carName)){
            return new Benz();
        }
    }
}

View Code

  假诺要生产一台汽车,直接调用 Car car = CarFactory.createCar(“BMW”);
就可以了。

    这种工厂尽管挺好,不过每一次要进入新车都得修改工厂类来投入新的判断语句,不吻合开闭原则;

  所以又有了一种更好的生产格局,这就是工厂方法情势。

 

二. 工厂方法格局

  首先抽象出一个生育汽车的工厂类接口,然后让现实工厂类实现这一个接口,这样就有泰Carter车生产工厂、宝马车生产工厂。

图片 5图片 6

public interface CarFactory{
    public static Car createCar();
}

public class BMWFactory implements CarFactory{
    public static Car createCar(){
        return new BMW();
    }
}

public class BenzFactory implements CarFactory{
    public static Car createCar(){
        return new Benz();
    }
}

View Code

   那样的益处就是只要自己还要生产长城汽车,不用去修改 CarFactory
工厂,只要写个长城工厂类去实现CarFactory接口就可以了。

 

    随着社会的提升,汽车项目也多了,比如分为越野车和跑车三个密密麻麻,这样原本 Car 接口就无法通用,

  而成为 YueYeChe 和 PaoChe
两个接口,而越野车适合在山上跑,跑车符合在赛路上跑,drive
的法门也改变了,如下:

图片 7图片 8

public interface YueYeChe{
    public void driveShanLu();
}

public interface PaoChe{
    public void driveSaiLu();
}

View Code

  而帕加尼和宾利都生产跑车和越野车:

图片 9图片 10

public BMWYueYeChe implements YueYeChe{
    public void driveYueYeChe(){
        System.out.println("我在山路上开宝马越野车");
    }
}

public BMWPaoChe implements PaoChe{
    public void drivePaoChe(){
        System.out.println("我在赛路上开宝马跑车");
    }
}

public BenzYueYeChe implements YueYeChe{
    public void driveYueYeChe(){
        System.out.println("我在山路上开奔驰越野车");
    }
}

public BenzPaoChe implements PaoChe{
    public void drivePaoChe(){
        System.out.println("我在赛路上开奔驰跑车");
    }
}

View Code

  

    遵照工厂方法形式,我们需要 YueYeCheFactory 和 PaoCheFactory
七个工厂接口,以及 BMWYueYeCheFactory 、

  BMWPaoCheFactory、BenzYueYeCheFactory 、BenzPaoCheFactory
两个具体工厂类。假诺需要再生产其他车,工厂类

  会呈指数增长,难以维护。假使能对工厂接口举行增加,不是更好?这样就时有发生了纸上谈兵工厂形式。

 

三. 抽象工厂形式

    工厂方法形式相似是指向一种体系的抽象产品的生产,为成为可以对多种多级的成品举办生产,而把工厂方法情势开展扩充,

  这就是架空工厂情势。因为 Car 类分成了跑车和越野车,所以扩展后的工厂接口也就能生育出跑车和越野车。这样,劳斯莱斯工厂类

  可以生产阿斯顿·马丁跑车和宝马越野车,帕加尼工厂类能够生育奥迪跑车和劳斯莱斯越野车。

图片 11图片 12

public interface CarFactory{
    public static PaoChe createPaoChe();
    public static YueYeChe createYueYeChe();
}

public BMWFactory implements CarFactory{
    public static PaoChe createPaoChe(){
        return new BMWPaoChe();
    }

    public static YueYeChe createYueYeChe(){
        return new BMWYueYeChe();
    }
}

public BenzFactory implements CarFactory{
    public static PaoChe createPaoChe(){
        return new BenzPaoChe();
    }

    public static YueYeChe createYueYeChe(){
        return new BenzYueYeChe();
    }
}

View Code

 

相关文章