扩展无极限:工厂设计模式与C#扩展方法的结合使用

本文通过实例展示了如何使用工厂模式创建对象,并利用C# 3.0的扩展方法为现有类添加新功能,增强了程序的扩展性和灵活性。

 

作者注:工厂类方法的例子参考了这位老兄的文章:http://www.cnblogs.com/fortune/archive/2007/09/12/890729.html
这里是为了给大家展示一下工厂模式和扩展方法给大家编程带来的扩展性和灵活性。

 

啥也不说,直接上code :)先建立产品的抽象类:

 

ContractedBlock.gifExpandedBlockStart.gifAbstractCar.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5
 6namespace DPTest.Factory
 7ExpandedBlockStart.gifContractedBlock.gif{
 8    public abstract class AbstractCar
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        public string name = String.Empty;
11        public abstract void Startup();
12        public abstract void Run();
13        public abstract void Turn();
14        public abstract void Stop();
15    }

16}

17

 再建立具体的产品类:

ContractedBlock.gifExpandedBlockStart.gifHongQiCar.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5
 6namespace DPTest.Factory
 7ExpandedBlockStart.gifContractedBlock.gif{
 8    public class HongQiCar : AbstractCar
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        public override void Startup()
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            
13        }

14
15        public override void Run()
16ExpandedSubBlockStart.gifContractedSubBlock.gif        {
17        }

18
19        public override void Turn()
20ExpandedSubBlockStart.gifContractedSubBlock.gif        {
21        }

22
23        public override void Stop()
24ExpandedSubBlockStart.gifContractedSubBlock.gif        {
25        }

26
27        public HongQiCar()
28ExpandedSubBlockStart.gifContractedSubBlock.gif        {
29            this.name = "HongQi";
30        }

31
32    }

33}

34

 

建立抽象工厂类:

ContractedBlock.gifExpandedBlockStart.gifAbstractFactory.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5
 6namespace DPTest.Factory
 7ExpandedBlockStart.gifContractedBlock.gif{
 8    public abstract class AbstractFactory
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        public abstract AbstractCar CreateCar();
11    }

12}

13

再建立具体工厂类:

ContractedBlock.gifExpandedBlockStart.gifHongQiCarFactory.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5
 6namespace DPTest.Factory
 7ExpandedBlockStart.gifContractedBlock.gif{
 8    public class HongQiCarFactory : AbstractFactory
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        public override AbstractCar CreateCar()
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            return new HongQiCar();
13        }

14    }

15}

16

 

再建立个通用管理类:

ContractedBlock.gifExpandedBlockStart.gifCarManager.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Web;
 5
 6namespace DPTest.Factory
 7ExpandedBlockStart.gifContractedBlock.gif{
 8    public class CarManager
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    {
10        public static AbstractCar GetHongQiCar(AbstractFactory factoryParameter)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            AbstractFactory factory = factoryParameter;
13            return factory.CreateCar();
14        }

15    }

16}

17

 

这样一来,我们的红旗车工厂就建好了。哈哈,通用都破产保护了,我竟然还在建汽车工厂。说明中国的经济还是不错的嘛。

我现在想生产一辆红旗汽车,代码是相当的简单:

ContractedBlock.gifExpandedBlockStart.gifProgram.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using DPTest.Factory;
 6
 7namespace CSharpEssentialTest
 8ExpandedBlockStart.gifContractedBlock.gif{
 9    class Program
10ExpandedSubBlockStart.gifContractedSubBlock.gif    {
11        static void Main(string[] args)
12ExpandedSubBlockStart.gifContractedSubBlock.gif        {
13            AbstractCar car = CarManager.GetHongQiCar(new HongQiCarFactory());
14            Console.Write(String.Format("Car name:{0}", car.name));
15            
16        }

17    }

18}

19

 

现在用户提出了一个变态的要求,需要这个红旗汽车可以扭来扭去。难道我要重新见个工厂?没资金了,怎么办啊。

不要慌,c#3.0扩展方法来了:

 先建立一个扩展类:

ContractedBlock.gifExpandedBlockStart.gifCommonExtendedMethods.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using DPTest.Factory;
 6
 7namespace CSharpEssentialTest
 8ExpandedBlockStart.gifContractedBlock.gif{
 9    static class CommonExtendedMethods
10ExpandedSubBlockStart.gifContractedSubBlock.gif    {
11        internal static void Twist(this AbstractCar car)
12ExpandedSubBlockStart.gifContractedSubBlock.gif        {
13            Console.Write(car.name + " is twisting.");
14        }

15    }

16}

17

 

然后将我们原来的调用程序就可以用上这个方法了。

ContractedBlock.gifExpandedBlockStart.gifProgram.cs
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using DPTest.Factory;
 6
 7namespace CSharpEssentialTest
 8ExpandedBlockStart.gifContractedBlock.gif{
 9    class Program
10ExpandedSubBlockStart.gifContractedSubBlock.gif    {
11        static void Main(string[] args)
12ExpandedSubBlockStart.gifContractedSubBlock.gif        {
13            AbstractCar car = CarManager.GetHongQiCar(new HongQiCarFactory());
14            Console.Write(String.Format("Car name:{0}", car.name));
15            car.Twist();
16            Console.ReadLine();
17            
18        }

19    }

20}

21

 

汽车真的可以扭来扭去了哦。


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值