zoukankan      html  css  js  c++  java
  • “妞”太多,如何管理?—— 三种创建型设计模式

    摘要:
    每个男程序员可能都会梦想自己有很多妞,其实你真的有很多“妞”,这个“妞”就是“new”!代码中我们经常需要new各种对象,new太多了,代码混乱不好用而且不好维护,如何才能管理好这些“妞”呢?本文将为你介绍设计模式中的其中三种创建型模式。

    作者
    张传波
    www.umlonline.org/school/

    作者自述:
    在高中时已经很喜欢coding,可惜没有考上计算机相关的大学专业,但仍然偏执于写程序,毕业后做了几年的程序员,后来成为项目经理直到常务副总。熟悉的语言有Basic、VB、C#,一直遗憾的事情是没有花时间去精通C++。很早就“看中”设计模式,但直到现在仅能在实际工作中实践过其中几种设计模式。所以,本文欢迎各位高手拍砖!

    一、简单工厂(不是模式的模式)

    如果在代码中经常要重复写这段代码,实在不太爽:
    if (…...)
    newObject = new TypeA(); //TypeA TypeB的父类一样。
    else if (…...)
    newObject = new TypeB(); //TypeA TypeB的父类一样。
    ……

    你考虑怎样改进?

    这样可不简单!用一个静态方法,根据传入参数返回所需的对象便可,在每个需要用到这个对象的地方,这样写便可:
    Object newObject = ObjectBuilder.CreateObject(string type);

    类图如下:

    简单工厂1.png



    以上这个设计就是简单工厂,简单工厂不是23种模式中的一种,但在我们实际工作中经常会用到,简单工厂是管理new的最常见方法。

    在程序中new对象一般没有这样简单,往往要根据不同的情况new不同的对象,并且要初始化对象,我们往往将这些工作“包装”到某个方法里面,通过这个方法直接得到需要的对象。

    二、工厂方法(Factory Method Pattern)

    我在实际工作中还没有用过工厂方法,下面简单谈谈我的理解,供大家参考。

    类图

    工厂方法1.png



    这个图一下子不太好理解,我们先回顾一下简单工厂,简单工厂是通过一个方法来包装new对象的动作,如果我们将new对象的动作包装到一个类中,那么这个类就可以看成是一个工厂,该工厂专门用来产生某些对象的。

    有时候我们希望能生产苹果、西瓜、葡萄等不同品种的水果,这样一个工厂就不能满足要求,我们需要分别做出苹果工厂、西瓜工厂、葡萄工厂,需要苹果时就调用苹果工厂的CreateProduct()就搞定了。

    但问题来了,我们希望程序不需要管是苹果工厂还是西瓜工厂,总之是工厂就行了。这样我们就需要将这些苹果工厂、西瓜工厂、葡萄工厂抽象为水果工厂了,就好像上图中的ProductA_Factory,ProductB_Factory继承了抽象类Factory。

    上图中无论是哪个工厂,生产的都是Product,Product、Factory已经被抽象,而ProductA_Factory实际生产的是ProductA1、ProductA2,ProductB_Factory实际生产的是ProductB1、ProductB2,注意上图中用了相同的颜色来表示哪个工厂生产哪些产品。

    三、抽象工厂(Abstract Factory Pattern)简介

    我在实际工作中我也没有用过抽象工厂,下面简单谈谈我的理解,供大家参考。

    类图

    抽象工厂1.png



    说明:图中黄底色文字不是类图的一部分,仅是用来说明的。

    有时候我们希望能得到一系列对象,不是一个对象,这时我们可考虑用抽象工厂,抽象工厂中有多个方法,分别得到不同的对象。
    如果仅是这样,我们不需要对工厂进行抽象,抽象工厂模式中要将工厂及产品都定义为接口,其目的就是如果程序想不加区别地得多个不同系列的对象,这时就需要实现这些接口。

    接口Factory定义了产生ProductA、ProductB的方法,如果需要产生更多的产品,可定义更多的方法。
    ConcreteFactory1实现了Factory接口,该类专门生产ConcreteProductA1、ConcreteProductB1产品;同理ConcreteFactory2专门生产ConcreteProductA2、ConcreteProductB2产品。
    这些具体工厂和产品都是实现了Factory、ProductA、ProductB接口的,故程序可以不加区别地处理。

    电子书《硬啃设计模式》下载

    本书介绍了我对23种设计模式的粗浅理解,本文的内容来自书中,有时间再分享更多书中内容。

    以下是封面和部分目录:

    封面.png



    目录.png


    猛点以下链接直接下载电子书:
    http://www.umlonline.org/school/attachment.php?aid=MTkxMXxlOWJlOTA2MHwxMzM2NjU2Mzc2fGQ0MDl4WWFwb1NUZU1EZWlMRzZmM1FTSW9MVWJWSnVYTGNid0ZnY24yYjM0Mmtn

    如果本文对你有帮助,麻烦点击一下“推荐”,谢谢!

  • 相关阅读:
    linux 鼠标中键粘帖功能?!!
    mysql 学习笔记(一)
    log4j的使用 与 父接口 slf4j 门面模式(外观模式)
    web.xml 配置 文章汇总
    2019.08.04 新建随笔
    spring-事务的七个传播行为,最近想出去面试,了解一下框架知识
    20190710 tomcat下的项目导入到eclipse中
    20190709 关于web.xml中webAppRootKey的解释
    20160624 策略模式
    20190616 IDEA-每次修改JS文件都需要重启Idea才能生效解决方法
  • 原文地址:https://www.cnblogs.com/umlonline/p/2495021.html
Copyright © 2011-2022 走看看