设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶

为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式

我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细

通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕

同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用。

试想我们遇到以下情景,我们该怎么处理

在工作中,我们需要处理不同类型的文件,有音频的,视频的,图片的,文本的。通过程序的处理,我们可以分别提取到不同的信息。

这种情况你准备怎么处理

工作经验少的同学默默的心理噗嗤一声,看我5分钟搞定

 class Program
    {
        static void Main()
        {
            var fileType = "Video";
            switch (fileType)
            {
                case "Video":
                    HandleVideoFile(fileType);
                    break;
                case "Audio":
                    HandleAudioFile(fileType);
                    break;
                case "Image":
                    HandleImageFile(fileType);
                    break;
                case "Text":
                    HandleTextFile(fileType);
                    break;
            }
            Console.ReadKey();
        }

        public static void HandleTextFile(string fileType)
        {
            Console.WriteLine("我开始处理文本文件了");
        }

        public static void HandleImageFile(string fileType)
        {
            Console.WriteLine("我开始处理图片文件了");
        }

        public static void HandleAudioFile(string fileType)
        {
            Console.WriteLine("我开始处理音频文件了");
        }

        public static void HandleVideoFile(string fileType)
        {
            Console.WriteLine("我开始处理视频文件了");
        }
    }

各个方法封装,独立,可随处调用,面向对象三大特性,简简单单随随便便给你展现一脸

后来,系统变强壮了,业务增加了,要求同时也能处理邮件Email

是不是你这个时候开始修改代码,增加一个方法,添加一个case,break;

如果后续陆陆续续好几十种继续增加,怎么办。程序的可维护性,可扩展性在哪里?

开放-封闭原则在哪里?

开放-封闭原则是只软件实体(类,模块,函数等等),应该可以扩展,但是不可修改

抛开所有原则,再增加5个,你这个类的代码得有1000行了吧,那么多case,break, 那天稍微不小心的改错一个,是不是会引起巨震。

所以,我们开始进行修改,也就是我们接下来进入正题的 简单工厂模式。

所谓的简单工厂模式,是将一个具体类的实例化交给一个工厂方法来执行

1个点,敲黑板,重点来了

工厂方法来执行。首先需要一个工厂,还需要一个方法。一个方法来干嘛?来实例化具体的类,具体的什么类?具体的算法类!

我们首先来定义一个抽象类

    public abstract class Handle
    {
        public abstract void HandleFile();
    }

这个类告诉全世界,要实现我,就得实现我的方法,我们是强关系,我们是合成关系,我们是拥有关系,我们是鸟儿与翅膀的关系!

而且不准实现我,要实现,先继承,要继承,就得override我的所有方法

于是,不得已,要处理的类纷纷开始实现

文件处理类

    /// <summary>
    /// 文本处理类
    /// </summary>
    public class TextHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我开始处理文本文件了");
        }
    }

图片处理类

   /// <summary>
    /// 图片处理类
   /// </summary>
    public class ImageHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我开始处理图片文件了");
        }
    }

视频处理类

    /// <summary>
    /// 视频处理类
    /// </summary>
    public class VideoHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我开始处理视频文件了");
        }
    }

音频处理类

    /// <summary>
    /// 音频处理类
    /// </summary>
    public class AudioHandle : Handle
    {
        public override void HandleFile()
        {
            Console.WriteLine("我开始处理音频文件了");
        }
    }

所有的处理类我们定义好了,如果后续,业务变更,需求增加,再添加什么邮件啊,电话啊,其他什么的,我们只需要继续添加我们的类,而不是通过去添加方法,这样每个类的单一职责原则是不是体现的很淋漓尽致了,如果单一职责觉得太书面,我们换个称呼,单一功能原则!没法再简单了

所有的处理类已经Ready了,我们的重点工厂可以开始修建了

    public class HandleFactory
    {
        public Handle CreateHandle(string fileType)
        {
            Handle handle = null;
            switch (fileType)
            {
                case "Video":
                    handle = new VideoHandle();
                    break;
                case "Audio":
                    handle = new AudioHandle();
                    break;
                case "Image":
                    handle = new ImageHandle();
                    break;
                case "Text":
                    handle = new TextHandle();
                    break;
            }
            return handle;
        }
    }

不要指指点点,不要指指点点,不要指指点点

我们就像项目过程一样,渐进明细

这次介绍的是简单工厂模式,简单工厂重点是 简单,工厂

后续增加业务的时候,我们只需要再加case,和对应的Handle类就好了

如何调用呢

 class Program
    {
        static void Main()
        {
            var handleFactory = new HandleFactory();
            var fileType = "Text";
            var handle = handleFactory.CreateHandle(fileType);
            handle.HandleFile();
        }

    }

是不是一下简单明了,你要是Web程序,可以,要是CS程序,可以,要是WebAPI,也可以

易扩展,可维护

总结下

优点

1、扩展性高,如果想增加一个处理方式,只要扩展一个处理类就可以。

2、屏蔽实现,只关心处理的结果

3、带你走进工厂模式

缺点

1、每次增加一个处理对象的时候,都需要增加一个处理类,还要同时告诉工厂,增加处理类型

2、增加了系统具体类的依赖

以上就是关于简单工厂模式的分享

一路前行,风雨无阻,不定时更新

时间: 2024-12-26 08:31:32

设计模式 2/23 工厂模式的相关文章

设计模式 2/23 工厂模式(二)

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了 没有太明显的优劣之分,只道是谁更适合 如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的 这一篇分享 工厂模式 回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行. 同时故意在上一篇提到了开放-封闭原则. 仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少. 如果我们要新增

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v

设计模式之简单工厂模式(Simply Factory)摘录

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其职责:(1).工厂(Creator)角色:简单工厂模式的

C#设计模式(2)——简单工厂模式

一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂模式的介绍 说到简单工厂,自然的第一个疑问当然就是什么是简单工厂模式了? 在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用”new”关键字创建一个对象时,此时该类就依赖与这个对象,也就是他们之间的耦合度高,当需求变化时,我

设计模式实现C++ --工厂模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建型模式 分类: 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要修改工厂类.有点抽象,举个例子就明白了.有一家生产处理器核的厂家,它只有一个工厂,能够生产两种类型的产品.客户需要什么样的产品,一定要显示地告诉生产工厂.下面给出一种实现方案: 1 #include <iostream> 2 #include <string> 3

C#设计模式(2)-简单工厂模式

引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式:本文将以多数据库操作为例进行讲解: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式,它属于创建型模式. 在现实生活中工厂是负责生产产品的,同样在设计模式中,简单工厂模式我们也可以理解为负责

学习大话设计模式01_简单工厂模式(简易计算器)

1 /** 2 * 面向对象(运算类) 3 * 简易计算器 4 * @author Monica 5 * 6 */ 7 public class Operation { 8 private double numberA = 0; 9 private double numberB = 0; 10 11 //虚函数 12 public double GetResult() { 13 double result = 0; 14 return result; 15 } 16 17 public doub