工厂模式
工厂模式总的来说就是使用工厂方法来代替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. 解耦,高层模块需要知道产品的抽象类,其他的实现类不用关心,符合迪米特法则,我不需要的就不要去交流;也符合依赖倒置原则,只依赖产品的抽象类;也符合历史替换原则,使用产品子类替换产品类父类。
抽象工厂模式
适用场景:
不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。
首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。