工厂模式&抽象工厂模式

时间:2022-10-02 15:02:24

工厂模式

工厂模式总的来说就是使用工厂方法来代替new创建对象。主要用来封装对象创建过程的复杂性。

可分为三类:

1)简单工厂模式(Simple Factory) 
2)工厂方法模式(Factory Method) 
3)抽象工厂模式(Abstract Factory)

简单工厂模式

建立一个工厂(一个函数或一个类方法)来制造新的对象。

/**
* Created by dushangkui on 2017/5/22.
*/
public class Car {
private String brand;

public Car(String brand) {
this.brand = brand;
System.out.println("创建一个Car,brand=" + brand);
}
}

/**
* Created by dushangkui on 2017/5/22.
*/
public class SimpleFactory {

public static Car createCar(){
return new Car("BYD");
}
}


代码有点儿多此一举,意思表达到了就好。

工厂方法模式

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Methods lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类)

工厂模式&抽象工厂模式

在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。GoF把简单工厂模式当成了工厂方法模式的一种特例。

创建两个汽车类:

public class Benz extends Car {
public Benz() {
super("Benz");
System.out.println("创建一辆奔驰车");
}
}

public class BMW extends Car {

public BMW() {
super("BMW");
System.out.println("创建一辆宝马车");
}
}


然后创建工厂类

public abstract class  AbstractCarFactory {
public abstract<T extends Car> T createCar(Class<T> clazz);
}

创建具体的工厂类

public class CarFactory extends AbstractCarFactory {
@Override
public <T extends Car> T createCar(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

场景类

public class Client {
public static void main(String[] args) {
CarFactory factory = new CarFactory();
factory.createCar(BMW.class);
factory.createCar(Benz.class);
}
}

优点:
1. 封装性良好,代码结构清晰。
2. 扩展性非常优秀,在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以拥抱变化。
3.屏蔽产品类。产品类的实现如何变化,调用者不需要关心,它只要关心产品的接口,只要接口保持不变,系统中的上层模块就不需要发生变化。
4. 解耦,高层模块需要知道产品的抽象类,其他的实现类不用关心,符合迪米特法则,我不需要的就不要去交流;也符合依赖倒置原则,只依赖产品的抽象类;也符合历史替换原则,使用产品子类替换产品类父类。

抽象工厂模式

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类)
       工厂模式&抽象工厂模式
抽象工厂模式的最大缺点是产品族扩展非常困难,最大优点是产品等级扩展非常容易

适用场景:

        不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

        首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

       其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

       再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。