工厂模式

1,工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

将选择实现类、创建对象统一管理和。从而调用跟我们的实现类解耦

简单工厂:

简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知到一些指定的参数

定义一个总的接口:

public interface Car {
    public void produce();

}

定义接口下的一些子类:

public class BMW implements Car {
    @Override
    public void produce() {
        System.out.println("宝马汽车生产。。。");
    }
}
class Ferrari implements Car {
    @Override
    public void produce() {
        System.out.println("法拉利生产。。。");
    }

}
class Buick implements Car {
    @Override
    public void produce() {
        System.out.println("别克汽车生产。。。");
    }

}

定义一个工厂,创建一个方法,来获得这些实例

public class CarFactroy {
    public static Car getCar(String name) {
        
        if (StringUtils.isEmpty(name)) {
            return null;
        }
        if (name.equals("BMW")) {
            return new BMW();
        }
        if (name.equals("Ferrari")) {
            return new BMW();
        }
        if (name.equals("Buick")) {
            return new Buick();
        }
        return null;

    }

}

通过传入指定的参数,通过工厂生产不同的对象

public class Client {
    public static void main(String[] args) {
        Car car = CarFactroy.getCar("BMW");
        car.produce();
    }

}

 

简单工厂的缺点:如果对象很多,再对象工厂类里面就会维护的非常困难。

工厂方法:

工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

简单工厂到工厂方法的演变,简单工厂的工厂不是生成对象的角色了,交给其他工厂去完成...

比如一个汽车会有好品牌,如果用简单工厂的话,每个品牌都用一个对象来维护,就会难以维护,尝试工厂方法:

定义个接口:

 

public interface Car {
    public void produce(String name);
}

 

定义要接口下的子类:

public class BMW implements Car {
    @Override
    public void produce(String name) {
        System.out.println("宝马汽车" + name + "生产。。。");
    }
}

class Ferrari implements Car {
    @Override
    public void produce(String name) {
        System.out.println("法拉利" + name + "生产。。。");
    }

}

class Buick implements Car {
    @Override
    public void produce(String name) {
        System.out.println("别克汽车" + name + "生产。。。");
    }

}

定义汽车工厂:

//用来生产汽车的工厂 
public interface CarFactroy {

    public Car getCar(String name);

}

定义工厂下面的子类工厂(具体生产的某型号的工厂)

 

 

public class BMWFactory implements CarFactroy {

    @Override
    public Car getCar(String name) {
        return new BMW();
    }
}
class FerrariFactory implements CarFactroy {

    @Override
    public Car getCar(String name) {
        return new Ferrari();
    }

}

class BuickFactory implements CarFactroy {

    @Override
    public Car getCar(String name) {
        return new Buick();
    }

}

 

生产不同型号的汽车:

public class Client {
    public static void main(String[] args) {
        //BMW工厂
        CarFactroy carFactroy = new BMWFactory();
        Car X5 = carFactroy.getCar("BMW X5");
        X5.produce("X5");
        
        Car X7 = carFactroy.getCar("BMW X7");
        X5.produce("X7");
        
    }

}

 3 ,抽象工厂

抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。

例如上面的例子,每个品牌的汽车生产厂,汽车生产都要生产发动机,生产轮胎,可将具体的产品抽象为工厂

 

定义个工厂:这个工厂更像是组装厂,工厂的工厂,

//用来组装的工厂
public interface CarFactroy {

    //生产发动机 
    Engine assemblyEngine();
    
    //生产论轮胎
    Tyre assemblyTyre();

}

继续定义具体的发送机的工厂,轮胎的工厂

//生产发动机
public interface Engine {
    
    //压力测试
    void pressureTest();
    
    //功能测试
    void eolTest();

}
public interface Tyre {
    
    //螺丝测试
    void screwTest();
    
}

具体的实现:

public class BMWEngine implements Engine {

    @Override
    public void pressureTest() {
        System.out.println("宝马发动机压力测试");
    }

    @Override
    public void eolTest() {
        System.out.println("宝马发动机功能测试");
    }

}

class BMWTyre implements Tyre {

    @Override
    public void screwTest() {
        System.out.println("宝马轮胎螺丝测试");
    }

}

实现组装的工厂:

public class BMWFactory implements CarFactroy {

    @Override
    public Engine assemblyEngine() {

        return new BMWEngine();
    }

    @Override
    public Tyre assemblyTyre() {
        return new BMWTyre();
    }

}

Client:

public class Client {
    
    public static void main(String[] args) {
        CarFactroy carFactroy = new BMWFactory();
        Engine assemblyEngine = carFactroy.assemblyEngine();
        Tyre assemblyTyre = carFactroy.assemblyTyre();
        assemblyEngine.pressureTest();
        assemblyTyre.screwTest();
    }

}

 

posted @ 2019-06-26 14:02  Chris,Cai  阅读(211)  评论(0编辑  收藏  举报