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

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了

没有太明显的优劣之分,只道是谁更适合

如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的

这一篇分享 工厂模式

回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行.

同时故意在上一篇提到了开放-封闭原则.

仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少。

如果我们要新增一种Email的处理,我们需要修改的是工厂,在工厂里面加case ,break,这个事实业务扩展了,但是代码修改了,如果使用工厂方法,我们可以避免这种修改工厂的情况

保持一个对扩展开发,对修改关闭的原则

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

敲黑板的时候又来了

定义一个接口,让子类决定实例化哪一个工厂,创建过程延迟到子类进行。怎么理解,怎么破,怎么办!

想象这样一个场景,我们知道世界制造业霸主,富士康集团,几乎覆盖了所有电子产品的制造,如 手机,鼎盛时期,苹果,摩托,诺基亚,等等,都是由其制造。

而这些制造又是由富士康旗下的子公司进行制造,比如现在叫富智康的公司,当时就是生产诺基亚,而现在的郑州富士康,专注苹果的生产

这个时候,我们理解富士康就是一个接口,他高傲的告诉全世界,我可以生产手机,我的子公司,只要实现我,就会制造手机。我们是弱关系,我们是聚合,我的子公司必须实现制造手机同时也可以制造电脑!!!

于是乎,各个子公司就是富士康的子类,对每个子公司来讲,只有在子公司内部,才会去具体生产对应的手机

当你想生产苹果手机的时候,你来到富士康的大门,问,苹果生产厂怎么走,然后就得到指引,一路闻着味寻去

重点,你,你想生产苹果手机,不是富士康想生产苹果手机,决定权,选择权是在你,客户端,而不是工厂

仔细琢磨,其中的微妙,以前是你告诉富士康你要生产苹果手机,然后富士康去决定让谁生产,现在是你决定让富士康的某个厂为你生产苹果手机,

你-富士康-厂

你-富士康的厂

细微的差别,带来的是无穷的烦恼

讲完怎么理解,我们看看代码怎么实现。依然用我们上一篇对应的例子,

处理不同类型的文件,有音频的,视频的,图片的,文本的

采用工厂模式,先定义一个接口,

    /// <summary>
    /// 处理工厂接口
    /// </summary>
    public interface IHandleFactory
    {
        /// <summary>
        /// 创建具体的工厂
        /// </summary>
        /// <returns></returns>
        Handle CreateHandle();
    }

然后,让其子类自己决定实例化哪一个工厂类

音频处理工厂

    /// <summary>
    /// 音频处理工厂
    /// </summary>
    public class AudioHandleFactory : IHandleFactory
    {
        /// <summary>
        /// 我实例化 音频处理
        /// </summary>
        /// <returns></returns>
        public Handle CreateHandle()
        {
            return new AudioHandle();
        }
    }

图片处理工厂

    /// <summary>
    /// 图片处理工厂
    /// </summary>
    public class ImageHandleFactory : IHandleFactory
    {
        /// <summary>
        /// 我实例化 图片处理
        /// </summary>
        /// <returns></returns>
        public Handle CreateHandle()
        {
            return new ImageHandle();
        }
    }

文本处理工厂

    /// <summary>
    /// 文本处理工厂
    /// </summary>
    public class TextHandleFactory : IHandleFactory
    {
        /// <summary>
        /// 我实例化 文本处理
        /// </summary>
        /// <returns></returns>
        public Handle CreateHandle()
        {
            return new TextHandle();
        }
    }

然后具体的处理方法类和以前一样

    /// <summary>
    /// 抽象类 处理
    /// </summary>
    public abstract class Handle
    {
        /// <summary>
        /// 处理文件
        /// </summary>
        public abstract void HandleFile();
    }

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

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

    /// <summary>
    /// 音频处理工厂
    /// </summary>
    public class AudioHandleFactory : IHandleFactory
    {
        /// <summary>
        /// 我实例化 音频处理
        /// </summary>
        /// <returns></returns>
        public Handle CreateHandle()
        {
            return new AudioHandle();
        }
    }

我们看客户端怎么调用

  static void Main()
        {
            var handleFactory=new AudioHandleFactory();
            var handle = handleFactory.CreateHandle();
            handle.HandleFile();
        }

OK,以上就是工厂模式

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

我知道,昨天的那种情况应该按照如下写

 static void Main()
        {
            IHandleFactory handleFactory = null;
            var fileType = "Image";
            switch (fileType)
            {
                case "Audio":
                    handleFactory = new AudioHandleFactory();
                    break;
                case "Image":
                    handleFactory = new ImageHandleFactory();
                    break;
                case "Text":
                    handleFactory = new TextHandleFactory();
                    break;
            }
            if (handleFactory != null)
            {
                var handle = handleFactory.CreateHandle();
                handle.HandleFile();
            }
            Console.ReadLine();
        }

这样才符合题意

我知道,还是有case,break, 但是我们已经把判断提到了客户端,仔细琢磨下,和最初的写方法,判断,再到后续的简单工厂模式,但现在的工厂模式,一不一不的进化,细微的差别,程序的可扩展性,仔细回味

仍然不要急,我们最终是会使用反射利器,干掉switch的

总结下

优点

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、高扩展性,如果想增加一个产品,只要扩展一个工厂类和一个产品类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

系统越做越复杂,到底是一开始的写方法调用直接调用方便,还是现在工厂模式方便,其实是根据现实业务进行选择的

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

一路前行,风雨无阻,不定时更新,原计划是明天晚上更新,但明天会不家,所以提前更新

时间: 2024-12-25 23:32:04

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

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

二、设计模式总览及工厂模式详解

二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场景. 2.2.内容定位 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的 是解耦.设计模式天天都在用,但自己却无感知.我们把设计模式作为一个专题,主要是学习设计模式 是如何总结经验的,把经验为自己所用.学设计模式也是锻炼将业务需求转换技术实现的一种非常有效 的方

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

设计模式之工厂模式 (二)

工厂模式分为三大类 简单工厂(SimpleFactory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 动态工厂(Dynamic Factory,属于优化版简单工厂) 一.简单工厂 组成如下: (1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. (2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口.在java中由接口或者抽象类来实现. (3) 具体产品角色:工厂类所创建的对象就是此

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

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

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

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

C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

原文:C#设计模式之三抽象工厂模式(AbstractFactory)[创建型] 一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂

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

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