今天在学习工厂模式,从最简单的简单工厂模式开始。
我们现在需要通过工厂Factory生产A,B两款产品(都是产品,实现了接口Product)。
产品A:
public class A implements Product { public A() { System.err.println("生产了产品A"); } }
产品B:
public class B implements Product { public B() { System.err.println("生产了产品B"); } }
A,B实现的接口Product:
public interface Product { }
接下来就是我们用来实例化A,B的工厂类:
public class Factory { public Product create(int i) throws Exception { switch (i) { case 1: return new A(); case 2: return new B(); default: throw new Exception("没有该产品。"); } } public static void main(String[] args) throws Exception { Factory f=new Factory(); f.create(1); f.create(2); f.create(3); } }
简单工厂中只有一个工厂,这个工厂可以接收参数,并根据参数来决定返回什么样的实体。所有创建的工作都由该工厂完成。
简单工厂有一个不方便的地方在于,当我们需要需要新增一种产品,比如产品C,这时候我们不仅需要新建C的实体类,还需要修改工厂类的方法。如果需要生产的产品足够多,我们工厂类则会显得十分复杂,各种判断。
这时候我们就思考了,可不可以让一个工厂只生产一种产品呢,这样工厂类内部就简单了。
如下,我们先定义一个借口Product,所有可以生产产品的工厂类都要实现这个接口。
/** * <p> * * 工厂类接口 * </p> * * @author wangchao * * @version 1.0.0 * * @since 1.0.0 * */ public interface FactoryInterface { //创建方法 public Product create(); }
实现了这个接口的工厂:
/** * <p> * 工厂A,专门负责生产A类产品 * </p> * * @author wangchao * * @version 1.0.0 * * @since 1.0.0 * */ public class FactoryA implements FactoryInterface { @Override public Product create() {return new A(); } }
/** * <p> * 工厂B,专门负责生产B类产品 * </p> * * @author wangchao * * @version 1.0.0 * * @since 1.0.0 * */ public class FactoryB implements FactoryInterface { public Product create() { return new B(); } }
这样的话,每一个工厂的实现就非常简单了。但是这样还是有一个问题,我们需要为为一个产品创建一个工厂,如果我们的产品足够多,我们就得创建足够的工厂,这样肯定不是我们想要的。
我们需要一个更加抽象的工厂,来实现有共同属性的产品的生产。
比如,现在我们现在对A产品要生产两个型号:A-1、A-2,B产品也需要生产两个型号:B-1、B-2。如果按照上面的工厂方法,我们需要写四个