定义:
定义一个创建对象的接口,但由实现这个接口的类来决定实例化哪个类,工厂方法把类的实例化推迟到子类中进行。
工厂方法模式,又称工厂模式,也叫多态工厂模式。
在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建。
工厂方法模式UML类图:
代码如下:
public class Client {
public static void main(String[] args) {
IFactory factoryA = new FactoryA();
factoryA.createProduct().sayName();
IFactory factoryB = new FactoryB();
factoryB.createProduct().sayName();
}
}
interface IProduct {
void sayName();
}
class ProductA implements IProduct {
@Override
public void sayName() { System.out.println("i am apple"); }
}
class ProductB implements IProduct {
@Override
public void sayName() { System.out.println("i am banana"); }
}
interface IFactory {
IProduct createProduct();
}
class FactoryA implements IFactory {
@Override
public IProduct createProduct() { return new ProductA(); }
}
class FactoryB implements IFactory {
@Override
public IProduct createProduct() { return new ProductB(); }
}
优点:
可以避免创建者和具体产品之间的紧密耦合。
单一责任原则。可以将产品创建代码移动到程序中的一个位置,使代码更易于支持。
开/关原则。可以在不破坏现有客户端代码的情况下将新类型的产品引入程序中。
缺点:
由于需要引入许多新的子类来实现该模式,因此代码可能会变得更加复杂。最好的情况是当将模式引入到创建者类的现有层次结构中时。
应用场景:
事先不知道代码应该使用的对象的确切类型和依赖关系。
客户端(应用层)不依赖产品类实例如何被创建、实现等细节。
通过重用现有对象而不是每次都重新构建它们来节省系统资源时,使用工厂方法。