很多人都用过抽象工厂模式,我是个新手,对于模式只是用过些,不敢谈熟悉,然而应句老话:无知才会胆大.也正因为我是初学者的原因吧,所以才有了一些不知道对不对的想法.
cnblogs的文章很多,我也只看了TerryLee 的文章来cnblogs的,对于TerryLee ,我是很感谢的,所学很厂,基本上我想学的都在他上面有所讨论.所以对于文中都有的模式知识,我也就引用了.
TerryLee的抽象工厂模式图:


受petshop的影响,在抽象工厂模式中的抽象层,我也是喜欢Interface这个关键词的,也许我对interface和Abstract区别的理解并不是很彻底,我用模式并不多,因为我开发的和参与的大型项目并不多,也只是在看到的时候google一下他们的区别,下次要是你再问我,我也就只能装傻了.
在WCF中,interface被当作一个协议的契约,就像所有的实际的和非实际的契约一样,我还是喜欢他的功能的单一分化,契约就是契约,它只让告诉你协议格式是怎样的,就像你的信应该怎么写一样,至于你的协议里写的是张三或者李四,要么就是卖车,还是卖房子,这个契约是不用管的.
Interface类是不可直接实类化的(abstract同样).里面的方法是不需要实现,而且必须要在实现接口的类中实现,abstract是在子类中实现,不同的是abstract里的方法不一定都得是虚的,可以定义自己实现好了的方法.因为interface只能定义不能在接口中实现的接口方法,所以对于interface来说变量也是无用的,也就不能定义变量了.

在抽象类工厂中,我们也可以看interface是一种契约,一个产品模型的契约,定义汽车的样式和功能,飞机的样式和功能......
为什么人们给这种方法起名的时间叫他工厂模式呢,那就点有工厂的样式,先给个代码:

 1// 接口类
 2public interface ICar
 3{
 4    int GetMaxSpeed();
 5}

 6
 7// 工厂要生产的模型1
 8public class ACar : ICar
 9{
10    private int maxSpeed = 10;
11
12    public int GetMaxSpeed()
13    {
14        return maxSpeed;
15    }

16}

17
18// 工厂要生产的模型2
19public class BCar : ICar
20{
21    private int maxSpeed = 20;
22    public int GetMaxSpeed()
23    {
24        return maxSpeed;
25    }

26}

27
28// 工厂
29public sealed class Factory
30{
31    // 命名空间,也就是类所在的逻辑路径
32    private static readonly string path = "";
33
34    public static ICar CreateCar()
35    {
36        string className = path + ".ACar";//或者BCar
37        return (ICar)Assembly.Load(path).CreateInstance(className);
38    }

39}

40
41// 业务逻辑
42public class User
43{
44    private static readonly ICar dal = Factory.CreateCar();
45    int maxSpeed = dal.GetMaxSpeed();
46}

使用者给工厂一个ICar契约,就是叫工厂做一个什么样子的东西,工厂在符合契约的基础上启到方案A或B,工厂造出了产品给user,user用他来实现他的功能.
也许有些会想,这些只要interface就能实现了,为什么还要factory干什么呢,这就是工厂一个重要的功能了,他的工厂整体的改动,如多语言化,数据库的整体迁移.这就是path的改变,path所代表的命名空间的改变,可以轻松便宜地实现这一计划.
posted on 2008-05-30 17:10  蜡笔旺旺  阅读(309)  评论(0编辑  收藏  举报