前面我们介绍了简单工厂模式,今天我们来看一下工厂模式。
工厂模式的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
我们看以下例子。首先是产品类,用来定义共产所生产的部分产品,这部分代码和简单工厂模式的代码相同。
//产品接口
public interface Product { void run(); } //具体产品 public class Bicycle implements Product { @Override public void run() { System.out.println("ride on a bicycle"); } } public class Car implements Product { @Override public void run() { System.out.println("drive car"); } }
接下来是和简单工厂不同的地方,首先我们先回忆一下之前简单工厂的工厂类
//简单工厂的工厂类
public class Factory { public static void createProduct(String productName){ Product product = null; switch (productName){ case "car": product = new Car(); break; case "bicycle" : product = new Bicycle(); break; } product.run(); } }
接下来我们看一下工厂模式下的工厂类,这里把工厂区分为了各个产品的工厂,抽取出一个工厂接口,在每个具体的工厂中创建产品类的实例。
//工厂接口
public interface IFactory {
//创建产品 Product createProduct(); }
//具体工厂
public class CarFactory implements IFactory { @Override public Product createProduct() {
//创建产品实例对象 return new Car(); } } public class BicycleFactory implements IFactory { @Override public Product createProduct() { return new Bicycle(); } }
最后我们看一下简单工厂模式和工厂模式客户端实现的区别
//简单工厂模式下客户端
public class Customer { public static void main(String[] args) { Factory.createProduct("car"); Factory.createProduct("bicycle"); } }
//工厂模式下的客户端 把简单工厂模式下的工厂类中判断创建产品实例的逻辑移动到了客户端中,由客户端来判断
public class Customer { public static void main(String[] args) { IFactory carFactory = new CarFactory(); Product car = carFactory.createProduct(); car.run(); IFactory bicycleFactory = new BicycleFactory(); Product bicycle = bicycleFactory.createProduct(); bicycle.run(); } }
我们可以看到简单工厂模式中,客户端只需要把自己的需求中告诉工厂,工厂可以自己去判断生产哪一个产品,这种模式的优点就是去除了客户端与产品的依赖,但是每次我们增加新产品时都要去修改工厂类,这样就有可能对其他产品产生影响,违反了开放-封闭原则,而且工厂和产品分支耦合,根据依赖倒转原则,才有了后来的工厂方法。正如上文工厂模式定义的那样,我们创建了一个IFactory接口,然后定义了多个具体产品工厂类实现这个接口,在具体产品工厂类中生产产品(创建产品实例),这样每次我们新增产品时,就不用去改原来的工厂方法,只需要添加新的工厂就可以了。