简单工厂模式vs工厂方法模式

2020/4/10 21:01:25

本文主要是介绍简单工厂模式vs工厂方法模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

简单工厂模式结构图

image.png

工厂方法模式结构图

image.png

雷锋工厂

比如有大学生和社区资源者以雷锋的名义去帮助老人做事情。
雷锋类:

namespace ConsoleApp1
{
    /// <summary>
    /// 雷锋类,定义工厂方法所创建的对象的接口
    /// </summary>
    class LeiFeng
    {
        public void Sweep() {
            Console.WriteLine("扫地");
        }

        public void Wash() {
            Console.WriteLine("洗衣");
        }

        public void BuyRice() {
            Console.WriteLine("买米");
        }
    }
}

学雷锋做事的大学生:

namespace ConsoleApp1
{
    /// <summary>
    /// 学雷锋的大学生
    /// </summary>
    class Undergraduate:LeiFeng
    {
          
    }
}

学雷锋做事的社区自愿者:

namespace ConsoleApp1
{
    /// <summary>
    /// 学雷锋的社区志愿者
    /// </summary>
    class Volunteer :LeiFeng
    {
    }
}

简单工厂类:

namespace ConsoleApp1
{
    /// <summary>
    /// 简单雷锋工厂类
    /// </summary>
    class SimpleFactory
    {
        public static LeiFeng CreateLeiFeng(string type) {
            LeiFeng result = null;
            switch (type) {
                case "学雷锋的大学生":
                    result = new Undergraduate();
                    break;
                case "社区志愿者":
                    result = new Volunteer();
                    break;
            }
            return result;   
        }
    }
}

客户端代码:

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //简单工厂模式,这里有三句重复的代码
            LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
            studentA.BuyRice();
            LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
            studentB.Sweep();
            LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
            studentC.Wash();
        }
    }
}

再用工厂方法模式写一遍,创建雷锋工厂:

namespace ConsoleApp1
{
    //雷锋工厂,声明工厂方法,该方法返回一个雷锋类型的对象
    interface IFactory
    {
        LeiFeng CreateLeiFeng();
    }

}

namespace ConsoleApp1
{
    //学雷锋的大学生工厂
    class UndergraduateFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Undergraduate();
        }
    }
}

namespace ConsoleApp1
{
    //学雷锋的社区志愿者工厂
    class VolunteerFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Volunteer();
        }
    }
}

客户端调用:

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //工厂方法模式
            IFactory factory = new UndergraduateFactory();
            LeiFeng student = factory.CreateLeiFeng();

            student.BuyRice();
            student.Sweep();
            student.Wash();

            Console.ReadLine();
        }
    }
}

何时用简单工厂?何时用工厂方法?

工厂方法是简单工厂的进一步抽象和推广。工厂方法克服了简单工厂违背开放——封闭原则的缺点,即如果还要添加一个学雷锋的xx对象工厂,就要在工厂类的方法里加"Case"的分支条件,修改原有的类?这就等于说,不但对扩展开放了,对修改也开放了。 但缺点就是由于每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。



这篇关于简单工厂模式vs工厂方法模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程