本文参考自《大话设计模式》《图解设计模式》,工厂方法实际上包括简单工厂(静态工厂)、普通工厂、抽象工厂三种设计模式,主要用来避免直接用new关键字生成类的实例,下面进行一一讲解:
简单工厂
最简单的工厂模式,用于生成某个类的实例,例如我们常见到如下代码:
Fragment fragment = MyFragment.newIntance();
// or
Calendar calendar = Calendar.getInstance();
// or
Integer number = Integer.valueOf("3");
像这样不用new而是使用类中提供的静态方法构造对象的设计模式称为
静态工厂。
静态工厂的一大优点就是可以根据传入的参数确定返回的类型:
class Father {
private Father() {
}
public static Father newInstance(String type) {
if (type.equals("ChildA")) { // 根据类型判断返回那个子类对象
return new ChildA();
} else {
return new ChildB();
}
}
public void getName() {
System.out.println("My name is father");
}
private static class ChildA extends Father {
public void getName() {
System.out.println("My name is child A");
}
}
private static class ChildB extends Father {
public void getName() {
System.out.println("My name is child B");
}
}
}
但是简单工厂违反了开闭原则,也就是当客户端需要更多的类型时(例如ChildC),只能通过修改newInstance方法来满足需求。
工厂方法
简单工厂在类中定义了创建对象的静态方法,而工厂方法则定义了创建对象的类(工厂类)
先看工厂方法的UML类图:
其中Creator中包含了生产抽象产品Product的方法create(create通过调用factoryMethod获得实例,还可以对其进行处理),在子类ConcreteCreator中可通过重写factoryMethod返回具体的产品ConcreteProduct。
下面通过一个例子说明工厂模式:
Factory规定了制作抽象产品的流程(获得实例->注册->返回),抽象产品规定了自己具有的方法(use),因此具体工厂和具体类都应该满足要求。
工厂模式是简单工厂的进一步抽象和推广,克服了简单工厂违反开闭原则的缺点,又保持了封装对象创建过程的优点,缺点是每增加一个产品就要增加一个工厂类,增加了额外的开发量
抽象工厂
抽象工厂方法是工厂方法的一种推广,工厂方法只能用于生产一种产品,而抽象工厂则规定了生产多种产品的接口: