深入浅出设计模式之工厂模式
随着工作经历的不断增加,每一个程序员都不可避免的会涉及到从一个普通程序员成长为一个高级或资深程序员的过程。在这个工程中,需要学习很多更加深入的知识,这其中就包括针对代码结构的设计和优化的思想,而培养这种思想的前提就是需要学习设计模式。在接下来的一段时间内,本人将逐一分享一些设计模式的经验。希望对各位学习设计模式有一些帮助。
工厂模式
工厂模式定义:提供创建一组对象的标准接口。
如何使用?
工厂模式应该是任何一个系统中使用最多的设计模式之一,为什么说工厂模式最为常用,原因很简单,因为工厂模式的作用就是替代我们的代码中出现new关键字对一个对象的创建,工厂模式就是用来创建对象。
一般情况下,我们创建一个对象,使用如下代码:
Node node = new Node();
如果我们需要传入构造参数,创建的代码如下:
Node Node = new Node(参数);
但是,在很多情况下,我们创建一个对象都不是简单的属于参数就可以完成的,比如:查询数据,或者通过配置文件获取一些信息等,这就导致了一个类的构造函数中需要实现较多的功能,这样不利用代码优雅设计,代码极为难看。
为什么说,这种情况下代码极为难看。很多人都知道,在程序设计中,Java提倡面向对象原则,而面向对象原则有提倡分派和封装。尽量将较长的代码段分派到各个单一职责的方法或者接口中去实现,这一点也是Java中提倡的单一职责原则。这样做降低了代码修改的难度,如果需要修改代码,只需要修改一处,不会导致牵一发而动全身。
下面使用一些例子来说明工厂方法的使用:
首先建立创建Node的工厂类:
public class NodeFactory { public Node create(int type) { if (type == 1) { return new NodeA(); } else if (type == 2) { return new NodeB(); } else { throw new RuntimeException("Error Type: " + type); } } }
这样来初始化Node对象的直接好处就是,在我们需要初始化Node归到一个地方来实现,这样就可以方便的修改Node对象初始化的过程。同样也减少了出现错误的几率,必进事情越少做,越不容易犯错误。
工厂模式分为两种:工厂方法模式和抽象工厂模式
在上边的例子中,我们实现的是工厂方法模式,如果创建的对象复杂度升高,这个时候就需要使用抽象工厂模式。具体来看一下代码:
这里假设,Node有连个实现类NodeA和NodeB,同样Node2也有两个实现类Node2A和Node2B,那么我们将上列中的Factory变成抽象工厂类实现,实现抽象工厂模式
public abstract class AbstractFactory { public abstract Node createNode(); public abstract Node2 createNode2(); class NodeAFactory extends AbstractFactory { @Override public Node createNode() { return new NodeA(); } @Override public Node2 createNode2() { return new Node2B(); } } class NodeBFactory extends AbstractFactory { @Override public Node createNode() { return new NodeB(); } @Override public Node2 createNode2() { return new Node2B(); } } }
从上面看,我们实现了一个抽象工厂,分别产生NodeA和Node2A的工厂,和NodeB和Node2B的工厂。至此,我们已经详细介绍了工厂模式的使用,这里的例子只是简单的实现。在实际的生成环境的系统中,工厂模式往往还可以结合其他模式一起使用,比如享元模式。这些实现我们可以在后续的讲解中提及到。