设计模式(四):Abstract Factory模式

Abstract Factory模式是对Factory Method模式的进一步演变。Factory Method所要解决的是new的问题。而Abstract Factory模式则试图为创建一系列产品提供统一的接口。当需要创建某一系列产品的时候,可以从抽象工厂中选择相应的系列创建一个具体的工厂类。



OK,我们现在就来假设一个场景,比如需要一个GUI(图形用户界面),它既可以显示Windows风格的按钮,也可以显示OSX风格的按钮。这个时候我们就可以抽象出一个Button类,它作为WinButton和OSXButton的抽象基类,它们则代表着具体的“产品”。作为生产这些“产品”对应的工厂,WinFactory和OSXFactory则继承自一个AbstractFactory。这样,当客户端(Client)代码在创建相应的“产品”的时候,它并不知道具体“产品”,以及具体“工厂”的细节,和它打交道的都是接口或者抽象类。这很好体现了一个面向对象设计原则“针对接口编程,而不要针对实现编程”。(注:这里的接口并不是狭义的语言中的interface,它是指的广义的超类型(supertype) )

Java代码:

/*
* GUIFactory example
*/


abstract   class  GUIFactory
{
    
public static GUIFactory getFactory()
    
{
        
int sys = readFromConfigFile("OS_TYPE");
        
if (sys == 0)
        
{
            
return new WinFactory();
        }

        
else
        
{
            
return new OSXFactory();
        }

   }


   
public abstract Button createButton();
}


class  WinFactory  extends  GUIFactory
{
    
public Button createButton()
    
{
        
return new WinButton();
    }

}


class  OSXFactory  extends  GUIFactory
{
    
public Button createButton()
    
{
        
return new OSXButton();
    }

}


abstract   class  Button
{
    
public abstract void paint();
}


class  WinButton  extends  Button
{
    
public void paint()
    
{
       System.out.println(
"I'm a WinButton: ");
    }

}


class  OSXButton  extends  Button
{
    
public void paint()
    
{
       System.out.println(
"I'm a OSXButton: ");
    }

}


public   class  Application
{
    
public static void main(String[] args)
    
{
        GUIFactory factory 
= GUIFactory.getFactory();
        Button button 
= factory.createButton();
        button.paint();
    }

    
// Output is either:
    
//   "I'm a WinButton:"
    
// or:
    
//   "I'm a OSXButton:"
}



C#代码:

/*
* GUIFactory example
*/


abstract   class  GUIFactory
{
    
public static GUIFactory GetFactory()
    
{
        
int sys = ReadFromConfigFile("OS_TYPE");
        
if (sys == 0)
        
{
            
return new WinFactory();
        }

        
else
        
{
            
return new OSXFactory();
        }

   }


   
public abstract Button CreateButton();
}


class  WinFactory : GUIFactory
{
    
public override Button CreateButton()
    
{
        
return new WinButton();
    }

}


class  OSXFactory : GUIFactory
{
    
public override Button CreateButton()
    
{
        
return new OSXButton();
    }

}


abstract   class  Button
{
    
public string Caption;
    
public abstract void Paint();
}


class  WinButton : Button
{
    
public override void Paint()
    
{
       Console.WriteLine(
"I'm a WinButton: " + Caption);
    }

}


class  OSXButton : Button
{
    
public override void Paint()
    
{
       Console.WriteLine(
"I'm a OSXButton: " + Caption);
    }

}


class  Application
{
    
static void Main()
    
{
        GUIFactory factory 
= GUIFactory.GetFactory();
        Button button 
= factory.CreateButton();
        button.Caption 
= "Play";
        button.Paint();
    }

    
// Output is either:
    
//   "I'm a WinButton: Play"
    
// or:
    
//   "I'm a OSXButton: Play"
}

在分层架构中,DAO层(数据存取对象 Data Access Object)会根据具体情况采用Abstract Factory模式和Factory Method模式构建DAO层。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值