抽象工厂模式

来源:互联网 发布:excel未知网络错误 编辑:程序博客网 时间:2024/05/11 14:51

参考链接:http://blog.csdn.net/wyxhd2008/article/details/5597975

分析

抽象工厂模式同工厂模式类似,工厂模式的每一个工厂产生一个具体的产品。而抽象工厂的每一个工厂产生的是一个产品族,每一个族可能有很多小的产品产品组成,类似于一个完整的产品有许多小零件组成。也就是其他文章可能常说的抽象工厂模式中,一个工厂可以产生多个产品,这个是与工厂模式的区别。

例如:一把枪由枪身和弹夹组成,不管哪个工厂生产,必定需要生产枪身和弹夹。这样我们可以抽象出来两个产品。抽象枪身A,抽象弹夹B,可以抽象出来一个工厂AbstractFactory, 他包含两个抽象方法CreateA和CreateB,来生产枪身和弹夹。不同的枪,枪身和弹夹是不同,这样可以有多个具体的枪身类继承于抽象枪身A,多个具体的弹夹类继承抽象弹夹B。这样我们也就需要多个不同的工厂继承与抽象工厂AbstractFactory来生产枪身和弹夹,从而来组装成一把完成的枪。
(文字比较多,有时间我补一个流程图)

在我看来工厂模式和抽象工厂的模式是适用于不同的情形,没有优劣之分。两个模式对比如下:

这里写图片描述

逻辑结构

abstract class ProductA    {        public void Method()        {            //公共方法        }        public abstract void MehodDiff();    }    abstract class ProductB    {        public void Method()        {            //公共方法        }        public abstract void MehodDiff();    }    class ConcreteProductA1 : ProductA    {        public override void MehodDiff()        {            //自己的方法        }    }    class ConcreteProductA2 : ProductA    {        public override void MehodDiff()        {            //自己的方法        }    }    class ConcreteProductB1 : ProductB    {        public override void MehodDiff()        {            //自己的方法        }    }    class ConcreteProductB2 : ProductB    {        public override void MehodDiff()        {            //自己的方法        }    }    //抽象工厂    abstract class AbstarctFactory    {        public abstract ProductA CreateProductA();        public abstract ProductB CreateProductB();    }    //具体工厂1(AB构成一个产品族)    class ConcreteFactory1 : AbstarctFactory    {        public override ProductA CreateProductA()        {            return new ConcreteProductA1();        }        public abstract ProductB CreateProductB()        {            return new ConcreteProductB1();        }    }    //具体工厂2(AB构成一个产品族)    class ConcreteFactory2 : AbstarctFactory    {        public override ProductA CreateProductA()        {            return new ConcreteProductA2();        }        public abstract ProductB CreateProductB()        {            return new ConcreteProductB2();        }    }
0 0
原创粉丝点击