关于最近学习的创建型设计模式

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

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

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

CLASS 果汁总工厂{

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


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


1号分工厂可能在城市

CLASS 1号分工厂 extends 总工厂{

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

}
}


2号可能在乡村

CLASS 2号分工厂 extends 总工厂{

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


}
}


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


CLASS 果汁总工厂{

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


CLASS 1号分工厂 extends 总工厂{

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


CLASS 2号分工厂 extends 总工厂{

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

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

[b]生成器模式[/b]

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

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


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

}


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

}

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


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

}

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


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


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


如果你不幸看到这里,很抱歉,请您不用纠结的去想这篇内容,因为我自己都被自己的举例弄晕了哈。
第一篇写创建模式,希望我以后的思想心得会像工厂流水线一样不断涌现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值