工厂形式

  以小车工厂为例,首先有个汽车类的接口 Car,里面有个发车的主意
drive(),然后有个保时捷车的类 Honda 和Mercedes-Benz车的类 Benz 完毕了 Car 接口。

必发bf88官网唯一 1必发bf88官网唯一 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

    将来只要要用 丰田 这些类,最基本的情势是:奥迪(Audi) bmw = new
丰田(Toyota)();  假使还要个 Benz 类,就得:new Benz();

  那样各类都得 new 个小车对象,不过宝三保太监兰博基尼都属于汽车,都有 drive()
方法;那我们是或不是能创造1个生育小车的工厂,

  然后想要什么小车告诉工厂,工厂帮您生产就足以了,而不用管生产的细节(约等于new 对象的进度),那样会更好啊?

  到此,不难工厂方式就出来了。

 

一. 简约工厂形式

必发bf88官网唯一 3必发bf88官网唯一 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(“奥迪”);
就足以了。

    那种工厂尽管挺好,不过每便要加盟新车都得修改工厂类来参预新的判定语句,不相符开闭原则;

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

 

必发bf88官网唯一,二. 工厂方法方式

  首先抽象出二个生产汽车的工厂类接口,然后让实际工厂类落成这一个接口,那样就有Lamborghi车生产工厂、Bentley车生产工厂。

必发bf88官网唯一 5必发bf88官网唯一 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
的主意也变更了,如下:

必发bf88官网唯一 7必发bf88官网唯一 8

public interface YueYeChe{
    public void driveShanLu();
}

public interface PaoChe{
    public void driveSaiLu();
}

View Code

  而Lamborghi三保沃尔沃都生产跑车和越野车:

必发bf88官网唯一 9必发bf88官网唯一 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
多个工厂接口,以及 奥迪YueYeCheFactory 、

  本田PaoCheFactory、BenzYueYeCheFactory 、BenzPaoCheFactory
五个具体工厂类。如若需求再生产其余车,工厂类

  会呈指数进步,难以保证。假使能对工厂接口举办扩展,不是更好?那样就发生了抽象工厂方式。

 

三. 抽象工厂形式

    工厂方法方式相似是对准一种系列的悬空产品的生产,为成为可以对多样七种的成品举行生产,而把工厂方法方式举办增加,

  那就是望梅止渴工厂情势。因为 Car 类分成了跑车和越野车,所以扩张后的厂子接口也就能生育出跑车和越野车。那样,Aston工厂类

  可以生产雷克萨斯跑车和宝王辉野车,Ferrari工厂类能够生育阿斯顿·马丁跑车和路虎越野车。

必发bf88官网唯一 11必发bf88官网唯一 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

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注