设为首页 加入收藏

TOP

一个工厂还能写出花来?(一)
2017-10-10 12:35:03 】 浏览:2779
Tags:一个 工厂 写出 花来
  • 简单工厂模式

  • 工厂模式

  • 抽象工厂模式

简单工厂模式

什么是简单工厂模式?

在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用"new"关键字创建一个对象时,此时该类就依赖与这个对象,也就是他们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,此时我们可以运用面向对象(OO)的很重要的原则去解决这一的问题,该原则就是——封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了。下面通过一个 现实生活中的例子来引出简单工厂模式。

一般情况下,如果我们想开什么车,只能自己去买,但是如今已是共享经济的时代,小到雨伞,中到自行车、电动自行车,大到汽车,如今都可以以租赁的形式使用。租车公司停了几辆车(奇瑞、路虎、兰博基尼),根据客户不同的意愿,租出去的车是不一样的,但是车都是在租车公司里有的。车都属于同一种抽象,租车公司里所有的车都有自己的特征,这些特征就是条件。租车公司根据客户不同的租车意愿,会租出不同的车。这就简单工厂模式的典型案例。

/// <summary>
/// 汽车类型
/// </summary>
public enum CarType
{
    /// <summary>
    /// 奇瑞
    /// </summary>
    Chery = 0,

    /// <summary>
    /// 路虎
    /// </summary>
    LandRover = 1,

    /// <summary>
    /// 兰博基尼
    /// </summary>
    Lambo = 2
}

/// <summary>
/// 汽车抽象类
/// </summary>
public abstract class Car
{
    /// <summary>
    /// 输出自己是什么车
    /// </summary>
    public abstract void Print();
}

/// <summary>
/// 奇瑞汽车
/// </summary>
public class CheryCar : Car
{
    public override void Print()
    {
        Console.WriteLine("我的品牌是奇瑞");
    }
}

/// <summary>
/// 兰博基尼
/// </summary>
public class LamboCar : Car
{
    public override void Print()
    {
        Console.WriteLine("我的品牌是兰博基尼");
    }
}

/// <summary>
/// 路虎
/// </summary>
public class LandRoverCar : Car
{
    public override void Print()
    {
        Console.WriteLine("我的品牌路虎");
    }
}

/// <summary>
/// 简单工厂
/// </summary>
public class SimpleFactory
{
    public static Car GetCar(CarType type)
    {
        switch (type)
        {
            case CarType.Chery:
                return new CheryCar();
            case CarType.LandRover:
                return new LandRoverCar();
            case CarType.Lambo:
                return new LamboCar();
            default:
                throw new Exception("未找到相应品牌汽车");
        }
    }
}

/// </summary>
/// 调用
/// </summary>
static void Main(string[] args)
{
    // 开兰博基尼
    Car car1 = SimpleFactory.GetCar(CarType.Lambo);
    car1.Print();
	
    // 开路虎
    Car car2 = SimpleFactory.GetCar(CarType.LandRover);
    car2.Print();

    Console.Read();
}

简单工厂模式的优缺点

看完简单工厂模式的实现之后,你和你的小伙伴们肯定会有这样的疑惑(因为我学习的时候也有)——这样我们只是把变化移到了工厂类中罢了,好像没有变化的问题,因为如果客户想租其他车时,此时我们还是需要修改工厂类中的方法(也就是多加case语句,没应用简单工厂模式之前,修改的是客户类)。我首先要说:你和你的小伙伴很对,这个就是简单工厂模式的缺点所在(这个缺点后面介绍的工厂方法可以很好地解决),然而,简单工厂模式与之前的实现也有它的优点:

  • 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割;
  • 简单工厂模式也起到了代码复用的作用,所有客户有用车需求时,都不需要自己买车,只需要负责消费就可以了。此时简单工厂的租车方法就让所有客户共用了。(同时这点也是简单工厂方法的缺点——因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响,也没什么不好理解的,就如事物都有两面性一样道理。

虽然上面已经介绍了简单工厂模式的缺点,下面还是总结下简单工厂模式的缺点:

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

简单工厂的应用场景

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

工厂模式

什么是工厂模式?


工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。

/// <summary>
/// 汽车类型
/// </summary>
public enum CarType
{
    /// <summary>
    /// 奇瑞
    /// </summary>
    Chery = 0,

    /// <summary>
    /// 路虎
    /// </summary>
    LandRover = 1,

    /// <summary>
    /// 兰博基尼
    /// </summary>
    Lambo = 2
}

/// <summary>
/// 汽车抽象类
/// </summ
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇再读设计模式七原则 下一篇编程心智(一)——代码架构与系统..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目