创建型的模式
对于需要根据上下文进行文件创建的情况,将创建一组含有达到相同任务目标的对象的过程进行封装,使之与调用者解耦
典型的例子是
一个控制操作系统显示,并打印图像的程序
驱动程序 | 在低配置机器上 | 在高配置机器上 |
显示 | 使用低分辨率驱动程序 | 使用高分辨率驱动程序 |
打印 | 使用低分辨率打印程序 | 使用低分辨率打印程序 |
采用swtich语句来选择程序流程的话:
public void Disp(){
swtich(系统环境){
case LOW:
// 低分辨率驱动
case HIGH:
// 高分辨率驱动
}
}
public void Print(){
swtich(系统环境){
case LOW:
// 低分辨率驱动
case HIGH:
// 高分辨率驱动
}
}
这里的问题是,驱动程序的选择与实际使用混杂在一起,如果需要修改或者添加一个新的驱动模式,不得不在程序的各个角落修改代码
使用FACTORY模式来分离驱动程序的选择
// 将驱动程序独立开
class DispDriver{
void Disp();
}
class LowDisp extends DispDriver{
void Disp() { // Disp low };
}
class HighDisp extends DispDriver{
void Disp() { // Disp high };
}
class PrintDriver{
void Print();
}
class LowPrint extends PrintDriver{
void Print() { // Print low };
}
class HighPrint extends PrintDriver{
void Print() { // Print high };
}
// 用来返回对应驱动程序的工厂
class DriverFactory{
DispDriver getDispDriver();
PrintDriver getPrintDriver();
}
class LowDriverFactory{
DispDriver getDispDriver(){ return new LowDisp() };
PrintDriver getPrintDriver(){ return new LowPrint() };
}
class HighDriverFactory{
DispDriver getDispDriver(){ return new LowDisp() };
PrintDriver getPrintDriver(){ return new LowPrint() };
}
对象的创建现在由工厂负责,客户代码只需要知道自己使用的DispDriver抽象和PrintDriver抽象
现在的问题只剩下应该使用哪个具体的工厂
可以使用一个配置文件(或者其他数据源) ,"告诉" Factory该使用创建哪个具体
switch ( 配置 )
case LOW:
DriverFactory df = new LowDriverFactory();
case HIGH:
DriverFactory df = new HighDriverFactory();
}
// 更进一步的做法是使用class的反射来确定使用哪个工厂
客户代码不需要关心了解具体的对象创建过程,甚至不需要了解具体使用了哪个工厂
public void Disp(){
DispDriver dd = df.Disp();
}
public void Print(){
PrintDriver pd = df.Print();
}
看上去新的代码同样使用了SWTICH来确定对象使用,但两者并不相同
abstract factory模式下, swtich与系统本身并不耦合,能够被很容易的修改
原情况下,多个swtich使用同一个变量作为开关变量,使之相互依赖,带来复杂和BUG
abstract factory模式用来将 "使用哪些对象" 的规则与 "如何使用这些对象"的逻辑分离开
书籍参考:<设计模式解析>