关闭

浅谈设计模式

165人阅读 评论(0) 收藏 举报

    花了两天时间好好研究了下设计模式,设计模式(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(){}
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2784次
    • 积分:91
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档