zoukankan      html  css  js  c++  java
  • 设计模式-简单工厂-创建型模式

    在设计模式当中有三大工厂,分别是 简单工厂抽象工厂工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现。
    简单工厂一般由以下几个对象组成:

    对象 作用
    工厂类 负责创建产品
    抽象产品类 工厂创建出来的产品抽象
    具体产品类 继承自抽象产品类,具体的产品功能

    那么我们为什么不直接 new 一个对象来执行操作呢?如果有以下代码:

    public class BusinessClass
    {
        public void Process()
        {
            Car _car = new Car();
            _car.Run();
        }
    }
    

    这么写的话,一旦我们业务逻辑发生变化,我不想创建 Car 对象了,我想创建一个 AirPlane 对象,他也具有 Run 方法,这个时候这种写法就很尴尬了,我需要在后面加一个 AirPlane air = new AirPlane() 然后再 Run。
    而工厂模式则将创建与使用分离开来,用户不用关心怎么创建的,只需要告诉工厂你需要哪种类型的对象,我给你创建好,你直接调用即可。乍一看来没有什么改变,但之前直接 new 对象的方式则造成 BusinessClass 对于 Car 等对象造成了一种依赖关系。
    换句话说,如果按照上面那种方式书写,BusinessClass 则是依赖于 Car 对象的,而简单工厂则是降低对象之间的耦合度(依赖)的。
    在上面的例子中,我们要封装他们的改变,他们之间改变的地方在于实例的创建,那么我们封装之后就由工厂来进行创建,便有以下代码:
    抽象产品类:

    public abstract class Product
    {
        void Run();
    }
    

    再有一个工厂类:

    public static class Factory
    {
        public static Product CreateInstance(string type)
        {
            switch(type)
            {
                case "Car":
                    return new Car();
                case "AirPlane":
                    return new AirPlane();
                default:
                    return null;
            }
        }
    }
    

    有了工厂类,我们再来定义两个具体的实现类:

    public class Car : Product
    {
        public override void Run()
        {
            Console.WriteLine("这是汽车");
        }
    }
    public class AirPlane : Product
    {
        public override void Run()
        {
            Console.WriteLine("这是飞机");
        }
    }
    

    之后我们再改一下刚才的 BusinessClass:

    public class BusinessClass
    {
        public void Process()
        {
            Product car = Factory.CreateInstance("Car");
            car.Run();
            Product air = Factory.CreateInstance("AirPlane");
            air.Run();
        }
    }
    

    这里其实我们也察觉了,如果我们每增加一个具体的产品,那么我们的工厂方法逻辑也会越来越臃肿,而且工厂类一点不能正常运行,就
    会造成灾难性的后果。
    简单工厂仅适用于工厂类负责创建的对象,较少的话对于工厂类的逻辑也不会太复杂。而且用户仅需要知道传入工厂类的参数即可创建对象,用户不需要具体的创建过程。

  • 相关阅读:
    第十二周
    第十一周作业
    第十周作业
    第九周作业
    第五周总结和实验报告三
    第四周总结和实验报告二
    第一周实验报告和第三周课程总结
    第二周总结
    2019春总结作业
    2019年春第二次课程设计实验报告
  • 原文地址:https://www.cnblogs.com/myzony/p/8434283.html
Copyright © 2011-2022 走看看