简单工厂(Simple Factory)模式

Posted by 猪头小队长 | 程序设计 | Friday 28 May 2004 20:56
//以下是摘编《Java设计模式》的第3章
一个简单工厂模式根据所提供的数据返回某个类的一个实例,此类可能是多个可能的类中的一个。通常它返回的类具有公共的父类和共同的方法,但每个类执行的任务各不相同,并且针对不同类型的数据进行了优
化。

上面的话可能不是很好懂,没关系,看完下面的例子再翻过来看,也许就好懂了一些。

例:有一个姓名登记表,要求用户输入姓名,用户可能的输入方式有两种:一种是:“名 姓”,另一种是“姓,名”。这样我们可以通过判断字符串中间是否有逗号来判断姓和名的顺序。

那么写一个类来处理名和姓的分离。
public class Namer{
protected String last; //姓
protected String first; //名
public String getFirst(){ //返回姓
return first;
}
public String getLast(){ //返回名
return last;
}
}

针对上面的两种不同情况,分别写两个类:
第一个类:采用空格分隔
public class FirstFirst extends Namer {
//当采用空格分隔姓名时
//由姓中抽取出名
public FirstFirst(String s) {
int i = s.lastIndexOf(" "); //查找分隔空格
if (i>0) {
first = s.substring(0, i).trim();
last =s.substring(i+1).trim();
} else {
first = ""; // 如果不存在空格
last = s; // 则全部存为姓
}
}
}
第二个类:采用逗号分隔
public class LastFirst extends Namer {
//当采用逗号分隔姓名时
//由姓中抽取出名
public LastFirst( String s) {
int i = s.indexOf(","); //查找分隔逗号
if (i > 0) {
last = s.substring( 0, i).trim();
first = s.substring( i + 1).trim();
}
else {
last = s; // 如果不存在逗号
first = ""; // 则全部存为姓
}
}
}

接下来就一个工厂类:
Public class NameFactory {
//根据是否存在逗号
//由工厂决定返回哪一个类。
public static Namer getNamer( String entry) {
int i = entry.indexOf(","); // 逗号决定姓名顺序
if (i > 0)
return new LastFirst( entry );
else
return new FirstFirst( entry );
}
}

这样,只要调用NameFactory.getNamer(String entry),就可以得到一个适合的Namer来处理。如果以后要增加一个以全角的空格或者其它符号分隔的Namer,只要多写一个Class和修改一下NameFactory就可以了。

琢磨完这个例子,返回顶部,看看那个综述是否明白了一些呢?

~oh,原来抄书也这么累哦,明白一件事情和说明白一件事情的差别太大
了!:(

//摘自《Java与模式》

简单工厂模式的优缺点

在简单工厂模式中,一个工厂类处于对产品类实例化的中心位置上,它知道每一个产品,它决定哪一个产品类应当被实例化。这个模式的优点是允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端,也就是说,它在某种程度上支持“开-闭”原则。

这个模式的缺点是对“开-闭”原则的支持不够,因为如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。

[@more@]

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word