C#设计模式--工厂模式和抽象工厂模式

2019-03-20 来源: si割 发布在  https://www.cnblogs.com/yinyongle/p/10567105.html

话说有三大潮牌公司一直相互PK,有一天举办了一个活动让这三大公司来一个PK,我们来看看哪家公司的上衣做出来好看穿得舒服

现在我们有一个上衣的抽象产品让三大公司来做

//抽象产品
    public interface Jacket
    {
        //上衣
        void Jk();
    }

三大公司就开始设计上衣

//CDS公司
    public class CDS : Jacket
    {
        public void Jk()
        {
            Console.WriteLine("我是CDS上衣");
        }
    }
    //KKW公司
    public class KKW : Jacket
    {
        public void Jk()
        {
            Console.WriteLine("我是KKW上衣");
        }
    }
    //DSN公司
    public class DSN : Jacket
    {
        public void Jk()
        {
            Console.WriteLine("我是DSN上衣");
        }
    }

设计的上衣差不多了开始要拿去给工厂加工了

//抽象工厂类
    public interface ComPanyFactory
    {
        //上衣工厂
        Jacket CreateJacket();
    }
    //CDS工厂
    public class CDSFactory : ComPanyFactory
    {
        public  Jacket CreateJacket()
        {
            return new CDS();
        }
    }
    //KKW工厂
    public class KKWFactory : ComPanyFactory
    {
        public Jacket CreateJacket()
        {
            return new KKW();
        }
    }
    //DSN工厂
    public class DSNFactory : ComPanyFactory
    {
        public Jacket CreateJacket()
        {
            return new DSN();
        }
    }

生产好的上衣要给大家看

ComPanyFactory cpf = new CDSFactory();
            Jacket CDSJ = cpf.CreateJacket();
            CDSJ.Jk();
            ComPanyFactory cpf2 = new KKWFactory();
            Jacket KKWJ = cpf2.CreateJacket();
            KKWJ.Jk();
            ComPanyFactory cpf3 = new DSNFactory();
            Jacket DSNJ = cpf3.CreateJacket();
            DSNJ.Jk();
            Console.ReadKey();

大家看了这三件上衣都挺不错的不分上下, 既然这个系列分不出高低, 再设计一个系列, 这次我们设计一个裤子吧。

public interface Pants
    {
        //裤子
        void Pant();
    }

三家公司开始设计裤子

    public class CDSPants : Pants
    {
        public void Pant()
        {
            Console.WriteLine("我是CDS裤子");
        }
    }
    public class KKWPants : Pants
    {
        public void Pant()
        {
            Console.WriteLine("我是KKW裤子");
        }
    }
    public class DSNPants : Pants
    {
        public void Pant()
        {
            Console.WriteLine("我是DSN裤子");
        }
    }
 //抽象工厂类
    public interface ComPanyFactory
    {
        //上衣工厂
        Jacket CreateJacket();
        //裤子工厂
        Pants CreatePants();
    }

    //CDS工厂
    public class CDSFactory : ComPanyFactory
    {
        public  Jacket CreateJacket()
        {
            return new CDS();
        }

        public Pants CreatePants()
        {
            return new CDSPants();
        }
    }
    //KKW工厂
    public class KKWFactory : ComPanyFactory
    {
        public Jacket CreateJacket()
        {
            return new KKW();
        }

        public Pants CreatePants()
        {
            return new KKWPants();
        }
    }
    //DSN工厂
    public class DSNFactory : ComPanyFactory
    {
        public Jacket CreateJacket()
        {
            return new DSN();
        }

        public Pants CreatePants()
        {
            return new DSNPants();
        }
    }
ComPanyFactory cpf = new CDSFactory();
            Jacket CDSJ = cpf.CreateJacket();
            CDSJ.Jk();
            Pants CDSP = cpf.CreatePants();
            CDSP.Pant();
            ComPanyFactory cpf2 = new KKWFactory();
            Jacket KKWJ = cpf2.CreateJacket();
            KKWJ.Jk();            Pants KKWP = cpf2.CreatePants();            KKWP.Pant();
            ComPanyFactory cpf3 = new DSNFactory();
            Jacket DSNJ = cpf3.CreateJacket();
            DSNJ.Jk();            Pants DSNP = cpf3.CreatePants();            DSNP.Pant();
            Console.ReadKey();

效果图:

个人总结:

工厂模式只能设计一个系列的产品, 再添加系列产品的时候就是抽象工厂模式。

抽象工厂的优点: 生产上衣裤子不管是哪间公司生产都会很快速的生产出来只需要继承抽象产品类和抽象工厂类

缺点:在生产裤子的时候要再写抽象产品接口,工厂要再添加接口方法子类再写一次工厂类方法

相关文章