论坛首页 Java企业应用论坛

深入浅出设计模式之工厂模式

浏览 7556 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-09  
随着工作经历的不断增加,每一个程序员都不可避免的会涉及到从一个普通程序员成长为一个高级或资深程序员的过程。在这个工程中,需要学习很多更加深入的知识,这其中就包括针对代码结构的设计和优化的思想,而培养这种思想的前提就是需要学习设计模式。在接下来的一段时间内,本人将逐一分享一些设计模式的经验。希望对各位学习设计模式有一些帮助。
工厂模式
工厂模式定义:提供创建一组对象的标准接口。
如何使用?
工厂模式应该是任何一个系统中使用最多的设计模式之一,为什么说工厂模式最为常用,原因很简单,因为工厂模式的作用就是替代我们的代码中出现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的工厂。
自此,我们已经详细介绍了工厂模式的使用,这里的例子只是简单的实现。在实际的生成环境的系统中,工厂模式往往还可以结合其他模式一起使用,比如享元模式。这些实现我们可以在后续的讲解中提及到。
   发表时间:2012-01-11  
抽象工厂就抽象工厂,标题干嘛叫工厂模式,他们有区别的
0 请登录后投票
   发表时间:2012-01-11  
工厂方法模式
0 请登录后投票
   发表时间:2012-01-12  
工厂模式主要是用来解偶的,达到使用对象的地方依赖的是某个接口而不是具体的实现,我觉得这才是工厂模式最重要的作用,工厂模式及抽象工厂模式更进一步就到了ioc了。

楼主说的“工厂模式”是用来解决“复杂的构造函数”的理由个人觉得不正确,如果构造一个对象本身很复杂,不管采用什么样的模式,它依然还会是复杂的
0 请登录后投票
   发表时间:2012-01-12  
madbluesky 写道
工厂模式主要是用来解偶的,达到使用对象的地方依赖的是某个接口而不是具体的实现,我觉得这才是工厂模式最重要的作用,工厂模式及抽象工厂模式更进一步就到了ioc了。

楼主说的“工厂模式”是用来解决“复杂的构造函数”的理由个人觉得不正确,如果构造一个对象本身很复杂,不管采用什么样的模式,它依然还会是复杂的

工厂模式解耦的作用这个毋庸置疑,我只是强调一下,在复杂构造函数的情况下,也可以考虑使用工厂方法来实现,这个是个人的一个看法,不代表一定是工厂模式的主要作用。另外,如果一个对象构造复杂,还可以考虑建造者模式,这些具体的 应用就是仁者见仁智者见智了。
0 请登录后投票
   发表时间:2012-01-12  
freish 写道
抽象工厂就抽象工厂,标题干嘛叫工厂模式,他们有区别的

写这篇文章的时候,是把抽象工厂模式和工厂方法模式都归结为工厂模式来讲解。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics