• 工厂模式


    问题一:最初对工厂模式认知,没什么用,就是把new包了一层,传入对应参数值,new对象时,本来就必须知道具体的类,包一层后,变成了必须知道具体的工厂类。

    后来,看了很多博客,找到一个靠谱的解释。

    设计模式的一个重要原则就是:别改代码,只需要添代码,以前所有的老代码,都是有价值的,需要尽力保留
    new一个对象时,new的过程是宝贵的如何创建老对象的知识点(有的new很复杂,包括了很多参数),如果这个代码被修改了,那么保留的老对象也不知道怎么使用了,整个体系残缺了
    所以要想办法保留老对象的new过程,把这个new过程保存分布到一系列工厂类里,就是所谓的工厂模式,一般有三种方式来封装

    简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。
    这个缺点是每添一个对象,就需要对简单工厂进行修改(尽管不是删代码,仅仅是添一个switch case,但仍然违背了“不改代码”的原则)

    工厂方法:每种产品由一种工厂来创建,一个工厂保存一个new
    基本完美,完全遵循 “不改代码”的原则

    抽象工厂:仅仅是工厂方法的复杂化,保存了多个new
    大工程才用的上

    简单工厂

    简单工厂模式我们也可以理解为负责生产对象的一个类我们平常编程中,当使用”new”关键字创建一个对象时,此时该类就依赖与这个对象,也就是他们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,此时我们可以运用面向对象(OO)的很重要的原则去解决这一的问题,该原则就是——封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了。下面通过一个现实生活中的例子来引出简单工厂模式。

    我觉得简单工厂,就是将if  else 或者 stwich case 去实例化单独放在一个类里面,方便维护,总比放在 UI 层或者重要的逻辑处理中看起来方便。

    并且,若传入参数用配置文件控制,这样大大方便的代码的处理,只需要加一个要实例化的类,更改工厂类,配置就行了,不需要更改其他类的内容。

    比如现在  华为,小米,魅族  三个对象都去实现生产手机这个动作。

    一般实现方式   :  华为   h = new  华为();

                                            h.造手机();

    普通工厂模式:

     

     ---违反了单一职责,开闭 等 升级到普通工厂

    普通工厂模式:

     一个类创建一个实例工厂

     

    升级一下,将工厂定义一个接口

     

     

    较少了对业务的依赖,原先依赖类,改为依赖工厂

    ------导致写的代码变多

    问题二:一开始觉得普通工厂还是需要先new,只不过是new的工厂,感觉没啥用。并且还将代码变多。

    我觉得,当工厂类在中间层和声明对象在UI层时,是有好处的。比如:当传入一个固定参数值时,我们可以直接在工厂类去加参数值,再传入实例化的类,

    不用 直接A a =new A(“123”),这时候只需要改工厂类和需要实例化的类,而不需要改UI层。

    抽象工厂:

    抽象工厂是一组类对象

     

    抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存在不足的地方。下面就具体看下抽象工厂的缺点:

    抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了开发——封闭原则。

     

     

     抽象工厂在确定一组类对象下,可以减少代码,但是无法扩展,只要扩展,就需要改动所用继承抽象工厂的类。

    问题三:在这里开始迷糊了,其实用接口也可以实现抽象工厂,那还为什么要用抽象类。具体用接口实现如下:

     

     

     我觉得这个主要差别在于抽象类与接口的主要差别。

     抽象成员 必须包含在抽象类里面,抽象类还可以包含普通成员

     继承抽象类后,必须显示的override其抽象成员

    ------------------------------------------------------------------------

     接口只能包含没有实现的方法

    实现接口的话,必须实现全部方法

    参考如下:

     

     

    看了许多相关文档,尤其搞不懂这几点为什么?最后还是理解总结了一下,最起码自己能说服自己了。

  • 相关阅读:
    Mybatis的动态sql以及分页
    Mybatis入门
    使用java代码操作Redis
    Redis安装和基本操作
    idea安装以及使用
    卢卡斯定理 Lucas (p为素数)
    三分/优选法(黄金分割法)求单峰函数极值
    缩点tarjan
    tarjan 求割点
    tarjan
  • 原文地址:https://www.cnblogs.com/anyihen/p/12431234.html
Copyright © 2020-2023  润新知