五个角色:产品角色(Product)、真实产品角色(ConcreteProduct)、工厂角色(Creator)、真实工厂角色(ConcreteCreator)、客户端(Client)
产品角色(Product):定义产品接口
真实产品角色(ConcreteProduct):实现产品的接口形成真实产品
工厂角色(Creator):声明工厂的方法并返回一个的产品
真实工厂角色(ConcreteCreator):客户端调用真实工厂返回一个真实产品
客户端(Client):运行并且得到产品
实现思路:客户端调用工厂生产相应的产品即可。
类图:
应用场景:Silverlight中需要创建多种播放器,并且每种播放器专门支持一种格式的文件(Mp4、图片、Flash)。
分析:每种播放器都是一个产品,为每一个产品配置一个工厂,每次客户端调用对应的工厂生产对应的产品即可。
下面我们在控制台程序去演示一下如何使用Factory Method Pattern:
一、 产品角色(Product)
- #region 产品角色
- abstract class Player
- {
- public abstract void Play();
- }
- #endregion
二、真实产品角色(ConcreteProduct)
- #region 真实产品角色 class FlashPlayer : Player { public override void Play() { Console.WriteLine("正在播放Flash文件"); } } class Mp4Player : Player { public override void Play() { Console.WriteLine("正在播放MP4文件"); } } class PicturePlayer : Player { public override void Play() { Console.WriteLine("正在播放Picture文件"); } } #endregion
三、工厂角色(Creator)
- #region 工厂角色
- abstract class PlayerFactory
- {
- public abstract Player CreatePlayer();
- }
- #endregion
四、真实工厂角色(ConcreteCreator)
- #region 真实工厂角色
- class PicturePlayerFactory : PlayerFactory
- {
- public override Player CreatePlayer()
- {
- Console.Write("图片播放器");
- return new PicturePlayer();
- }
- }
- class Mp4PlayerFactory : PlayerFactory
- {
- public override Player CreatePlayer()
- {
- Console.Write("Mp4播放器");
- return new Mp4Player();
- }
- }
- class FlashPlayerFactory : PlayerFactory
- {
- public override Player CreatePlayer()
- {
- Console.Write("Flash播放器");
- return new FlashPlayer();
- }
- }
- #endregion
五、客户端(Client)
- #region 客户端
- class Program
- {
- static void Main(string[] args)
- {
- //Flash播放器
- PlayerFactory Factory = new FlashPlayerFactory();
- Player player= Factory.CreatePlayer();
- player.Play();
- //Mp4播放器
- Factory = new Mp4PlayerFactory();
- player = Factory.CreatePlayer();
- player.Play();
- //Picture播放器
- Factory = new PicturePlayerFactory();
- player = Factory.CreatePlayer();
- player.Play();
- Console.ReadLine();
- }
- }
- #endregion
如需源码请点击 FactoryMethod.rar 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826994