简单工厂模式(Factory Pattern)

简单工厂模式的介绍


简单工厂模式可以理解为创建对象的一个类

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

关键代码:创建过程在其子类执行。

应用实例:

  1. 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  2. Hibernate 换数据库只需换方言和驱动就可以。

使用场景:

  1. 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式
  2. 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。


简单工厂模式的UML图


这里写图片描述


简单工厂模式的实现


实例:客户吃饭可以自己炒菜吃,但是自己炒菜太麻烦,可以到餐馆点菜就可以了,买菜的事情就交给餐馆做就可以了,这里餐馆就充当简单工厂的角色,下面让我们看看现实生活中的例子用代码是怎样来实现的。

抽象类Food:

using System;

namespace DesignModelDemo.Factory
{
    abstract class Food
    {
        public abstract void Print();
    }
}

PotatoFood:Food:

using System;

namespace DesignModelDemo.Factory
{
    class PotatoFood:Food
    {
        public override void Print()
        {
            Console.WriteLine("炒好了一盘土豆丝...");
        }
    }
}

TomatoFood :

using System;

namespace DesignModelDemo.Factory
{
    class TomatoFood : Food
    {
        public override void Print()
        {
            Console.WriteLine("炒好一盘西红柿...");
        }
    }
}

Customer:

using System;

namespace DesignModelDemo.Factory
{
    class Customer
    {
        //public static Food Cook(FoodType foodType)
        //{
        //    Food food = null;
        //    switch (foodType)
        //    {
        //        case FoodType.Tomato:
        //            food = new TomatoFood();
        //            break;
        //        case FoodType.Potato:
        //            food = new PotatoFood();
        //            break;
        //    }
        //    return food;
        //}

        static void Main(string[] args)
        {
            //Cook(FoodType.Tomato).Print();
            FoodFactory.CookFood(FoodType.Potato).Print();

            Console.Read();
        }
    }
}

FoodFactory:

using System;

namespace DesignModelDemo.Factory
{
    class FoodFactory
    {
        public static Food CookFood(FoodType foodType)
        {
            Food food = null;
            switch (foodType)
            {
                case FoodType.Potato:
                    food = new PotatoFood();
                    break;
                case FoodType.Tomato:
                    food = new TomatoFood();
                    break;
            }
            return food;
        }

    }
}

简单工厂模式的优缺点


优点:

  1. 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。
  2. 简单工厂模式也起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。(同时这点也是简单工厂方法的缺点——因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响,也没什么不好理解的,就如事物都有两面性一样道理)

缺点:

  1. 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响(通俗地意思就是:一旦餐馆没饭或者关门了,很多不愿意做饭的人就没饭吃了)
  2. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cchoop

有用的话请杯肥宅水

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值