//以下是摘编《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@]