跳转至

工厂模式

优点

  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
  • 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

适用场景

  • 作为一种创建型模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
  • 工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。
  • 由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。

示例代码

示例:简单工厂

C#
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 快餐店点一份汉堡
            Food food1 = Restaurant.Create("汉堡");
            food1.Cook();

            // 快餐店点一份薯条
            Food food2 = Restaurant.Create("薯条");
            food2.Cook();
        }
    }

    public abstract class Food
    {
        // 输出做了什么食物
        public abstract void Cook();
    }

    public class Hamburger : Food
    {

        public override void Cook()
        {
            Console.WriteLine("做了一份汉堡!");
        }
    }

    public class FrenchFries : Food
    {
        public override void Cook()
        {
            Console.WriteLine("做了一份薯条!");
        }
    }

    public class Restaurant
    {
        public static Food Create(string name)
        {
            Food food = null;
            if (name.Equals("汉堡"))
            {
                food = new Hamburger();
            }
            else if (name.Equals("薯条"))
            {
                food = new FrenchFries();
            }

            return food;
        }
    }
}

示例:工厂方法

C#
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化汉堡店和薯条店
            Factory.Restaurant rt1 = new Factory.HamburgerRestaurant();
            Factory.Restaurant rt2 = new Factory.FrenchFriesRestaurant();

            // 汉堡店点一份汉堡
            Factory.Food fhb1 = rt1.CreateFoodFactory();
            fhb1.Cook();

            // 薯条店点一份薯条
            Factory.Food fhb2 = rt2.CreateFoodFactory();
            fhb2.Cook();
        }
    }

    public abstract class Food
    {
        // 输出做了什么食物
        public abstract void Cook();
    }

    public class Hamburger : Food
    {

        public override void Cook()
        {
            Console.WriteLine("汉堡店做了一份汉堡!");
        }
    }

    public class FrenchFries : Food
    {
        public override void Cook()
        {
            Console.WriteLine("薯条店做了一份薯条!");
        }
    }

    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class Restaurant
    {
        // 工厂方法
        public abstract Food CreateFoodFactory();
    }

    public class HamburgerRestaurant : Restaurant
    {

        public override Food CreateFoodFactory()
        {
            return new Hamburger();
        }
    }

    public class FrenchFriesRestaurant : Restaurant
    {
        public override Food CreateFoodFactory()
        {
            return new FrenchFries();
        }
    }

示例:抽象工厂

C#
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 要一份肯德基的汉堡
            BrandFood rt1 = new Kfc();
            AbstractFactory.Hamburger hb1 = rt1.CreateHamburger();
            hb1.Cook();

            // // 要一份麦当劳的汉堡
            BrandFood rt2 = new Mcdonalds();
            AbstractFactory.Hamburger hb2 = rt2.CreateHamburger();
            hb2.Cook();
        }
    }

    /// <summary>
    /// 品牌食物
    /// </summary>
    public abstract class BrandFood
    {
        public abstract Hamburger CreateHamburger();
    }

    public class Kfc : BrandFood
    {
        public override Hamburger CreateHamburger()
        {
            return new KfcHamburger();
        }
    }

    public class Mcdonalds : BrandFood
    {

        public override Hamburger CreateHamburger()
        {
            return new McdonaldsHamburger();
        }
    }

    /// <summary>
    /// 汉堡抽象类
    /// </summary>
    public abstract class Hamburger
    {
        public abstract void Cook();
    }

    public class KfcHamburger : Hamburger
    {
        public override void Cook()
        {
            Console.WriteLine("肯德基——香辣鸡腿堡");
        }
    }

    public class McdonaldsHamburger : Hamburger
    {
        public override void Cook()
        {
            Console.WriteLine("麦当劳——麦辣鸡腿堡");
        }
    }
}


最后更新: 2022-05-06
回到页面顶部