您的位置:首页 > 其它

浅谈设计模式

2007-10-08 10:29 316 查看
花了两天时间好好研究了下设计模式,设计模式(design pattern),得到很多高人的大力推崇,就像很多人说学习设计模式好比修炼内功,难点就是如何在实际中运用。单单这两句话,我完全同意。下面,我谈下自己学习设计模式的感想。

首先从工厂模式开始:

工厂模式分三类:简单工厂(simple factory)模式;工厂方法(factory method)模式,又称多线性工厂模式 (polymophic factory pattern);抽象工厂(abstract factory)模式,又称工具箱(kit或toolkit)模式.

那么工厂模式我们又该如何在实际中运用,或者什么时候该运用工厂模式?

我们都知道,当我们实例化一个对象的时候,我们会这样写:以sample为例

Sample sample=new Sample().

很简单的创建对象,但实际情况是 我们经常需要在创建对象实例时做些初始化的工作,比如赋值,查询数据库或者更多。就像这样 Sample sample=new Sample(参数)。好像一切都对了,但是再次暴露了一个问题,如果参数需要很长一段代码,而不是简单的赋值。那我们的code就会相当难看。这个时候就需要refactor.于是工厂模式就该上场了。这也是完全符合OO的encapsulation 和 delegation思想的。下面我们简单看下如何运用

简单工厂模式是由单个工厂类来决定该实例化哪个子类。

假设要建立一个登记表单,允许你按照不同的格式如:“名 姓” 或者“姓,名”录入姓名,我们希望能通过姓和名之间是否有逗号来确定姓名的顺序。
姓名的基类:

public abstract class BaseName {
protected String firstName;
protected String lastName;

public String getFirstName() {
return this.firstName;
}

public String getLastName() {
return this.lastName;
}

}

姓在前的具体类:

public class FirstNameAtFirst extends BaseName{
public FirstNameAtFirst(String name){
int index=name.lastIndexOf(" ");
if(index>0){
firstName=name.substring(0,index);
lastName=name.substring(index+1);

}else{
firstName=name;
lastName="";
}
}
}

名在前的具体类:

public class LastNameAtFirst extends BaseName{
public LastNameAtFirst(String name){
int index=name.indexOf(" ");
if(index>0){
lastName=name.substring(0,index);
firstName=name.substring(index+1);
}else{
firstName="";
lastName=name;
}
}
}

单一的工厂类(测试):

public class SimpleFactoryTest {
public static BaseName getNamer(String entry){
int index=entry.indexOf(",");
if(index>0){
return new FirstNameAtFirst(entry);
}else{
return new LastNameAtFirst(entry);
}
}
public static void main(String[] args){
String entry="jiang yuanyuan";

System.out.println(getNamer(entry).getFirstName());
System.out.println(getNamer(entry).getLastName());
}
}

我们总结下其构造:

public class Creator
{
//创建工厂方法,一般根据参数来决定产生哪个产品
 public Product factory()
 {
  return new ConcreteProduct();
 }
}
//抽象产品
public interface Product
{
}
//具体的产品,一般有多个
public class ConcreteProduct implements Product
{
 public ConcreteProduct(){}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: