工厂模式(一)
来源:互联网 发布:tensorflow运行界面 编辑:程序博客网 时间:2024/04/18 13:05
最近在看设计模式的资料,这里也就聊聊对工厂模式的理解好了。
(一)略讲设计模式
设计模式,其实就是一种方法,不局限于语言甚至程序。例如,经典的单例模式,在Java程序中会用到,在日常生活中,其实,也是有的。合理使用设计模式可以为我们解决很多事情:1)首先,从程序的层面来说,可以用来完善代码的设计结构,使得代码更加清晰,可读性好,从而减少维护的成本;亦可用来避免资源耗损,实现“高内聚,低耦合”2)从设计角度来说,通过设计或者复用成熟的解决方案,抛弃实现细节,可以更有效的分析问题的本质。
设计模式的一般原则:
OCP(开闭原则,Open-Closed Principle):“Software entities should be open for extension,but closed for modification。件实体应当对扩展开放,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;对修改关闭,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。我的理解是,对于不同层次的编程,高层次暴露给低层次的应当只是接口,而不是它的具体类。
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。众所周知类(或模块)之间的通信越少,耦合度就越低,从而更有利于我们对软件的宏观管理
(二)工厂模式
工厂模式是一种非常常用的模式,因为它可以帮助生成实例对象,可以给系统带来更大的可扩展性和尽量少的修改量。
例如,我们有一个Human类,它有很多子类,例如Baby,Girl,Boy等等,每个类都有特定的dress(),而这个dress方法的第一步就是要去得到一件衣服:
class Female extends Human{
public void dress(){
Clothes clothes = new Skirt();
......
}
}
我们可以看到,这个Skirt的初始方法很简单,但是在初始方法很复杂的情况下呢,而通常情况下,一些实例化工作需要很多工作,例如赋值,查询数据库,例如你要先去数据库去查查现在这个Female的衣柜里面有没有Skirt,有什么Skirt等等。而这一切可能需要很多的代码,而dress()方法应该注重的是dress本身的工作。另外,将这么长的初始化过程放在dress()方法里面也有悖于面向对象的思想,封装和分派告诉我们,应该讲长代码分割成多个段,每个段对应尽量单一的作用,以保证低耦合的需求。
因此,工厂模式可以应用于这个场景中了
工厂模式通常分为三种:
1)简单工厂模式
2)工厂方法模式
3)抽象工厂模式
我们将在下面进行具体的介绍
(三)简单工厂模式
简单工厂模式,Simple Factory,由三种角色组成:工厂类,抽象产品角色,具体产品角色。
他们的关系可以由图1表示:
外界使用Factory来获取Product对象。
我们使用dress()来具这个例子:
首先创建一个Factory类:
class ClothesFactory{
public static Clothes getClothesInstance(String model){
Clothes clothes = null;
if(model.equals("Skirt")){
......
clothes = new Skirt(...);
}
if(model.equals("Uniform")){
......
clothes = new Uniform(...);
}
if(model.equals("JeansWear")){
......
clothes = new JeansWear(...);
}
......
return clothes;
}
}
这个工厂类方法提供一个静态方法,提供各种衣服的初始化动作。其类图如下:
简单工厂模式好处在于产品的等级不会反应到工厂类中,但是,如果要增加新产品就会引起工厂类的修改,例如要增加一种SwimSuit, 那么需要在ClothesFactory中增加:
if(model.equals("SwitmSuit")){
......
}
这显然不符合开闭原则。但对于不太复杂,而产品又不会做太多变化的场景,简单工厂模式仍然是适用的。
(四)工厂方法模式
工厂方法模式有四种角色:抽象工厂,具体工厂,抽象产品,具体产品
其关系图如下:
我们对上面的dress例子进行变化
abstract class ClothesFactory{
getClotesInstance().....
}
class SkirtFactory{
public static Clothes getClothesInstance(){
......
}
}
class UniformFactory{
public static Clothes getClothesInstance(){
......
}
}
class JeansWearFactory{
public static Clothes getClothesInstance(){
......
}
}
各自的工厂类提供对不同产品的初始化过程,返回对应衣服的实例。其类图如下:
工厂方法模式符合开闭原则,当新增一个产品时,只需要新增加新的具体产品和具体工厂就可以了,不需要对原有的逻辑进行修改。
(五)抽象工厂模式
抽象工厂模式的角色和工厂方法模式类似,但它面向的是更复杂的情况,我们看见工厂方法模式中所有的具体产品都集成自一个抽象产品,这是一种比较简单的结构,而抽象工厂模式面向于复杂的产品足的情况,例如Clothes有很多分类,Clothes下面的产品又隶属于不同的产品族,我们用类图来表述其中一种情况:
- 工厂模式(一)
- 工厂模式(一)
- 工厂模式(一)--简单工厂模式
- 工厂模式(简单工厂模式, 工厂方法模式, 抽象工厂模式)一
- 模式一(简单工厂)
- 简单工厂模式(一)
- (一)简单工厂模式
- 简单工厂模式(一)
- (一)简单工厂模式
- (一)简单工厂模式
- (一)简单工厂模式
- Java设计模式:工厂模式(一)简单工厂模式
- C++ 设计模式 (一) 工厂模式
- 设计模式之 工厂模式(一)
- 设计模式之工厂模式(一)
- 模式设计(一)------工厂模式
- 设计模式(一)--静态工厂模式
- 浅谈开发模式(一)--工厂模式
- TF-IDF(term frequency–inverse document frequency)
- 解决有外框的TABLE内包含radiobuttonlist也出现外框的问题
- hello
- 实现MyString类—类和动态内存分配
- 计算机网络基础-概要
- 工厂模式(一)
- 更改单文档应用程序主框架Frame的标题
- KD extension DLLs & KDCOM protocol
- Ubuntu下安装配置eclipse开发IDE环境
- 如何安全地嵌入第三方js
- 《Android开发从零开始》——8.Activity生命周期
- 浮动元素后元素外边距失效
- 有去巴塞罗那参加ICME2011的吗?
- Android Intent and Intent Filter