工厂方法模式
工厂方法模式(Factory Method)是创建型模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。也是对简单工厂模式的改进。
简单工厂模式的主要缺点出现在工厂类,工厂类在创建产品对象时不唯一,需要通过条件判断的方式来选择对应的产品类。所以在添加新的产品时,需要把对应的创建条件添加到工厂类中,造成工厂类违背开闭原则
。
工厂方法模式针对其缺点进行了改进,让工厂只创建一个产品,每个具体产品对应不同的工厂,并对每个工厂进行抽象,建立抽象工厂,这样使用者就可以只面对抽象工厂进行操作,当创建不同的产品时,只需要更换对应的工厂。这里使用了多态
特性(在程序中出现超类对象的任何地方都可以用子类对象置换),也是对依赖倒置原则
的应用。
下面通过具体的类图了解工厂方法模式
下面为代码实现
代码实现
public interface AbstractFactory {
Product newProduct();
}
public class ConcreteFactoryA implements AbstractFactory {
@Override
public Product newProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB implements AbstractFactory {
@Override
public Product newProduct() {
return new ConcreteProductB();
}
}
public interface Product {
void show();
}
public class ConcreteProductA implements Product {
@Override
public void show() {
System.out.println("创建产品---->A");
}
}
public class ConcreteProductB implements Product {
@Override
public void show() {
System.out.println("创建产品---->B");
}
}
public class Client{
public static void main(String [] args){
// 工厂 A 创建的产品
AbstractFactory factory = new ConcreteFactoryA();
Product product = factory.newProduct();
product.show();
// 工厂 B 创建的产品
factory = new ConcreteFactoryB();
product = factory.newProduct();
product.show();
}
}
可见,工厂方法模式解决了简单工厂模式的一些问题,在增加新的产品时,只需要添加一个具体产品类和一个对应的具体工厂类就可以了,其他工厂不需要改动。
值得注意的是在简单工厂模式中,创建一个产品是在工厂类内部进行选择判断的。而工厂方法模式把选择判断转移给了使用者,也就客户端来决定使用那个工厂来生产产品。你想要加功能,本来是修改工厂类的,而现在是修改客户端。
在工厂方法模式中,一个工厂只生产一类产品。如果一个工厂想要生产多种产品就需要在工厂中添加对应的方法就可以了,这就是下面要学习的抽象工厂模式
。