• 设计模式(C#)——02工厂模式


    推荐阅读:

           在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法。
          工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使其创建过程延迟到子类进行。把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。
     工厂模式要素:

    1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;

    2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;

    3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;

    4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。

    下面举个例子用类图来介绍一下上面几个要素之间的关系吧。
     在这里插入图片描述
          命名空间工厂方法模式中包含抽象工厂Factory、具体工厂LeiFactory 、抽象产品Volunteer,具体产品Leifeng 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
    代码实现过程:
    1.创建抽象类Volunteer

    abstract class Volunteer
    {
        public abstract void sweep();//扫地
        public abstract void cook();//煮饭
        public abstract void wash();//洗衣服
    }
    

    2.创建具体产品Leifeng

    class Leifeng : Volunteer
    {
        public override void sweep()
        {
            Console.WriteLine("雷锋扫地");
        }
        public override void cook()
        {
            Console.WriteLine("雷锋煮饭");
        }
        public override void wash()
        {
            Console.WriteLine("雷锋洗衣");
        }
    }
    

    3.创建抽象工厂Factory

    abstract class Factory
    {
        public abstract Volunteer getvol();
    }
    

    4.创建具体工厂LeiFactory

    class LeiFactory : Factory
    {
        public override Volunteer getvol()
        {
            return (new Leifeng());
        }
    }
    

    5.使用该工厂,通过传递类型信息来获取实体类的对象。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 工厂方法模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Factory fact = new LeiFactory();
                Volunteer lei = fact.getvol();
                lei.cook();
                lei.sweep();
                lei.wash();
    
                fact = new UniFactory();
                lei = fact.getvol();
                lei.cook();
                lei.sweep();
                lei.wash();
            }
        }
    }
    

    从上面代码可以发现:
    优点:
    1、一个调用者想创建一个对象,只要知道其名称就可以了。
    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    3、屏蔽产品的具体实现,调用者只关心产品的接口。

    缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
    整合后的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 工厂方法模式
    {
        class Program
        {
        //使用工厂方法
            static void Main(string[] args)
            {
                fact = new UniFactory();
                lei = fact.getvol();
                lei.cook();
                lei.sweep();
                lei.wash();
            }
        }
    }
    //抽象产品基类
    abstract class Volunteer
    {
        public abstract void sweep();
        public abstract void cook();
        public abstract void wash();
    }
    //具体产品子类
    class Leifeng : Volunteer
    {
        public override void sweep()
        {
            Console.WriteLine("雷锋扫地");
        }
        public override void cook()
        {
            Console.WriteLine("雷锋煮饭");
        }
        public override void wash()
        {
            Console.WriteLine("雷锋洗衣");
        }
    }
    //抽象工厂类
    abstract class Factory
    {
        public abstract Volunteer getvol();
    }
    //具体工厂
    class LeiFactory : Factory
    {
        public override Volunteer getvol()
        {
            return (new Leifeng());
        }
    }
    

          使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
          例如,我们我们增加一个人物:“博主”,此时我们只需要定义一个具体工厂——“博主”和具体产品——“博主”子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:

    //具体工厂——博主
    class BloggerFactory : Factory
    {
        public override Volunteer getvol()
        {
            return (new BloggerFactory ());
        }
    }
    //具体产品——博主子类
    class Blogger: Volunteer
    {
        public override void sweep()
        {
            Console.WriteLine("博主扫地");
        }
        public override void cook()
        {
            Console.WriteLine("博主煮饭");
        }
        public override void wash()
        {
            Console.WriteLine("博主洗衣");
        }
    }
    

    好了,工厂模式介绍完了,博主也该去扫地,煮饭,洗衣了。

  • 相关阅读:
    植物 miRNA 研究
    TargetScan 数据库简介
    miRTarBase 数据库简介
    dendrogram 和 barplot 的组合
    多线程基础必要知识点!看了学习多线程事半功倍
    Thread源码剖析
    多线程三分钟就可以入个门了!
    Java集合总结【面试题+脑图】,将知识点一网打尽!
    3分钟搞掂Set集合
    TreeMap就这么简单【源码剖析】
  • 原文地址:https://www.cnblogs.com/shirln/p/10245208.html
Copyright © 2020-2023  润新知