浅谈设计模式
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(){}
}
首先从工厂模式开始:
工厂模式分三类:简单工厂(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(){}
}
相关文章推荐
- 浅谈设计模式--单例模式(Singleton Pattern)
- 浅谈观察者设计模式
- java设计模式---浅谈2种工厂模式和单例模式
- 浅谈c#设计模式之单一原则
- 浅谈Java设计模式(十三)策略模式(strategy)
- 浅谈Java设计模式(十七)责任链模式(Chain of Responsibility)
- 浅谈java中的单态设计模式
- 浅谈java 23种设计模式之策略模式(Strategy Pattern)
- Android设计模式之浅谈MVP
- 浅谈java的23种设计模式
- 浅谈设计模式--装饰者模式(Decorator Pattern)
- 浅谈单例设计模式的几种实现方式
- 浅谈JAVA设计模式之——中介者模式(Mediator)
- 浅谈二十三种设计模式之构建者模式
- 浅谈设计模式之单例模式
- 【大话设计模式】——浅谈设计模式基础
- 浅谈设计模式——抽象工厂模式
- 浅谈设计模式之七——Composite模式
- 浅谈设计模式之八——Decorator模式
- 浅谈MFC中的设计模式