首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

关于日前学习的创建型设计模式

2012-12-20 
关于最近学习的创建型设计模式好吧,为了纪念我失业的这几个月时间,整理一下这段失业时间内的收获。今天这个

关于最近学习的创建型设计模式
好吧,为了纪念我失业的这几个月时间,整理一下这段失业时间内的收获。今天这个博客就正式开始投入使用了,下定决心要让这里记录我从今往后的技术历程,工作经历,生活琐事等。第一炮要响亮一点,写点什么呢?最近开始学习GOF的23中设计模式,就举个例子总结一下今天学习的 简单工厂模式,工厂模式,抽象工厂模式还有生产者模式。
简单工厂的本质是对类进行选择创建。
如有一个水果汁工厂,可以生产苹果汁,橙汁等水果。根据客户的口味,可以获得对应的产品。
CLASS水果汁工厂1{
     函数 生产水果汁(水果类型)
    {
     If 类型=苹果
        返回苹果汁
     Else
      ...
    }
}

可能更迷糊了。好吧,如果要举个平时经常看到的实践例子,一般中小项目的DAO的实现会采取这个做法。不过有的时候会使用读取配置文件,通过反射来实现这个工厂类,而不是IF ELSE。

工厂模式本质是将某些实现延迟到子类。
  如果这个水果工厂是一个连锁经营的工厂,总公司负责提供一种经营模式,提供设备,但是不知道分店使用的原料是怎么获得的。
  那么就有一个总工厂类:

CLASS 果汁总工厂{

     保护类型 抽象函数 先获得水果();//因为不知道这个分工厂的进货渠道等,所以每      个 分店自己决定


函数 生产水果汁()
   {
      获得水果();//反正分工厂一定会进货的,不管怎么弄到的货,反正可以使用。
       榨汁;
    }
}



1号分工厂可能在城市

CLASS 1号分工厂 extends 总工厂{

   保护类型  函数 先获得水果(水果类型)
  {
     可能是去收购 也可能是去仓库拿

  }
}



2号可能在乡村

CLASS 2号分工厂 extends 总工厂{

  保护类型   函数 先获得水果(水果类型)
  {
     可能是直接去自己的果园采摘等


  }
}





当父类不清楚子类的某个对象创建的具体实现的时候,可以用工厂模式。把创建延迟到子类对象。如本例中的水果原料,总工厂不能决定货源,只能由分工厂自己去进货。总工厂提供的设备只管生产。
看到这里更 更迷糊了吧,哈..那还是回到日常实践里的例子,struts1的ActionServlet和继承他的Action就是个典型的工厂模式。将每个请求的所需要产生的ActionForward对象的创建延迟到Action类。
ActionServlet就相当于总工厂。每个我们写的ACTION就是分工厂,ActionServlet先执行各种操作后 在调用ACTION类中的execute方法,获得ActionForward对象,然后继续执行调用JSP等操作。
抽象工厂模式
  可能这个工厂还经营有类似果粒橙这样果汁加果肉的饮料。那么客户向工厂订购的果汁就要和果肉对应起来,否则饮料就会变得很怪异,所以这个工厂就需要保证这两个生产的内容是对应的。因此就有下面这个实现,工厂提供的生产接口是对应的。



CLASS 果汁总工厂{

  抽象函数 生产水果汁();//因为不知道有这个分工厂具体经营哪些水果
抽象函数 生产水果肉();//因为不知道有这个分工厂具体经营哪些水果
}


CLASS 1号分工厂 extends 总工厂{

  函数 生产水果汁()
  {
      生产菠萝汁;
  }
函数 生产水果肉()
{
     生产菠萝果粒;
}
}


CLASS 2号分工厂 extends 总工厂{

  函数 生产水果汁()
  {
      生产苹果汁;
  }
函数 生产水果肉()
{
     生产苹果果粒;
}
}

客户只能获得1号工厂对象来生产菠萝果汁+菠萝果肉或者2号工厂对象来生产苹果果汁+苹果果肉。防止出现不匹配。这两个生产方法之间存在依赖关系,否则就退化成工厂模式。
这个我在平时还真没发现什么具体的应用,没法举代码的例子了,如果有请告诉我哦。

生成器模式
 
可能这个工厂还经营由多种果汁调配而成的混合果蔬饮料。各工厂生产果汁,由工厂研究机构进行指导调配而成。

CLASS 工厂研究机构{  //指导者


函数 生产混合果汁过程()
{
工厂生产果汁1;
加热等工艺过程
工厂生产果汁3;
静置等工艺过程
工厂一生产果汁2;
搅拌等工艺过程

}


CLASS 工厂1 {  //构建者
  大桶  //用来装混合果汁
  函数 生产苹果汁()
  {
      生产苹果汁 放入大桶;
  }
函数 生产葡萄汁()
{
     生产葡萄汁 放入大桶
}
函数 生产番茄汁()
{
     生产番茄汁 放入大桶 }

}

函数 获得混合果汁成品()
{
返回大桶;
}




CLASS 工厂2 {  //构建者
  大桶  //用来装混合果汁
  函数 生产菠萝汁()
  {
      生产菠萝汁 放入大桶;
  }
函数 生产西瓜汁()
{
     生产西瓜汁 放入大桶
}
函数 生产椰子汁()
{
     生产椰子汁 放入大桶 }

}

函数 获得混合果汁成品()
{
返回大桶;
}



工厂1和工厂2的生产产品可能不同,具体的生产过程可能也不同,但是他们用来混合成混合果汁的过程是一样的。
一般用在算法过程固定,但是生成的对象或则说内容不同的时候用的。



单例模式 本质是控制实例的个数
单例模式代码中见到的比较多,一般的配置文件的读取后,都会使用单例模式的对象来存放起来,节省开销。  单例模式有懒汉和恶汉式,懒汉 时间换空间,恶汉 空间换时间。
懒汉式如果使用现成同步来保证彻底的单例,会造成运算速度比较慢,有个比较完美的解决方案是 使用静态内部类。例子..如果忘记了,自己搜索去。




如果你不幸看到这里,很抱歉,请您不用纠结的去想这篇内容,因为我自己都被自己的举例弄晕了哈。
  第一篇写创建模式,希望我以后的思想心得会像工厂流水线一样不断涌现。

热点排行