博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之简单工厂模式
阅读量:4093 次
发布时间:2019-05-25

本文共 2978 字,大约阅读时间需要 9 分钟。

一、背景

现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。

在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替

二、定义

我么定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

三、简单工厂模式

1.介绍

我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式。在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。

简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在  23 种设计模式之列。

2.延伸

试想一下,当我们在coding的时候,在A类里面只要NEW了一个B类的对象,那么A类就会从某种程度上依赖B类。如果在后期需求发生变化或者是维护的时候,需要修改B类的时候,我们就需要打开源代码修改所有与这个类有关的类了,做过重构的朋友都知道,这样的事情虽然无法完全避免,但确实是一件让人心碎的事情。

3.模拟场景

在电影《速度与激情》中,主角需要根据导演不同的指令,来开不同的车。但是车都是在车库中存在的。车都属于同一种抽象,车库里所有的车都有自己的特征,这些特征就是条件。导演发出指令的时候,只要告诉场务特征,场务就知道提什么车。这就简单工厂模式的典型案例。

代码:

///     /// 抽象产品类: 汽车    ///     public interface ICar    {        void GetCar();    }    public enum CarType    {        SportCarType = 0,        JeepCarType = 1,        HatchbackCarType = 2    }    ///     /// 具体产品类: 跑车    ///     public class SportCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——跑车,交给主角");        }    }    ///     /// 具体产品类: 越野车    ///     public class JeepCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——越野车,交给主角");        }    }    ///     /// 具体产品类: 货车    ///     public class HatchbackCar : ICar    {        public void GetCar()        {            Console.WriteLine("场务把——货车,交给主角");        }    }    ///     /// 简单工厂核心代码    ///     public class Factory    {        public ICar GetCar(CarType carType)        {            switch (carType)            {                case CarType.SportCarType:                    return new SportCar();                case CarType.JeepCarType:                    return new JeepCar();                case CarType.HatchbackCarType:                    return new HatchbackCar();                default:                    throw new Exception("我这里没有车,你走吧!");            }        }    }    public class Program    {        static void Main(string[] args)        {            ICar car;            try            {                Factory factory = new Factory();                Console.WriteLine("主角下一场戏开——跑车。");                car = factory.GetCar(CarType.SportCarType);                car.GetCar();                Console.ReadKey();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }                   }    }

四、优点和缺点

优点:

  1. 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
  2. 客户端无需知道所创建具体产品的类名,只需知道参数即可。
  3. 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。

缺点:

  1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
  2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
  3. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  4. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。

应用场景

对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

参考:

转载地址:http://tjiii.baihongyu.com/

你可能感兴趣的文章
Vue学习:$event使用
查看>>
Vue学习:输入框点击回车触发事件
查看>>
递归练习一:输入一个字符串,打印出该字符串中字符的所有排列
查看>>
Vue Router的学习与使用
查看>>
Vue的插槽slot的使用
查看>>
let和var的区别
查看>>
Vue项目导入外部资源的方式
查看>>
js中遍历map对象键值的方法
查看>>
SpringSecurity解决跨域问题的方法
查看>>
Mac安装及配置Nginx
查看>>
使用Java High Level REST Client操作ElasticSearch
查看>>
ECharts的学习与使用
查看>>
Mysql内连接和外连接的使用
查看>>
解决Vue中v-show控制echarts图表显示但图表宽度为100px问题
查看>>
Mybatis的if判断不要使用boolean类型变量
查看>>
解决ant design vue中table表格内容溢出后,设置的width失效问题,超出的字用省略号代替
查看>>
解决Springboot中websocket跨域问题
查看>>
解决Ant Design Vue中form表单项初始值不能动态更新问题
查看>>
Java中判断Integer类型的值是否相等
查看>>
Mysql将查询结果直接生成一张新表
查看>>