问题一:最初对工厂模式认知,没什么用,就是把new包了一层,传入对应参数值,new对象时,本来就必须知道具体的类,包一层后,变成了必须知道具体的工厂类。
后来,看了很多博客,找到一个靠谱的解释。
设计模式的一个重要原则就是:别改代码,只需要添代码,以前所有的老代码,都是有价值的,需要尽力保留
new一个对象时,new的过程是宝贵的如何创建老对象的知识点(有的new很复杂,包括了很多参数),如果这个代码被修改了,那么保留的老对象也不知道怎么使用了,整个体系残缺了
所以要想办法保留老对象的new过程,把这个new过程保存分布到一系列工厂类里,就是所谓的工厂模式,一般有三种方式来封装
简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。
这个缺点是每添一个对象,就需要对简单工厂进行修改(尽管不是删代码,仅仅是添一个switch case,但仍然违背了“不改代码”的原则)
工厂方法:每种产品由一种工厂来创建,一个工厂保存一个new
基本完美,完全遵循
“不改代码”的原则
大工程才用的上
简单工厂
简单工厂模式我们也可以理解为负责生产对象的一个类, 我们平常编程中,当使用”new”关键字创建一个对象时,此时该类就依赖与这个对象,也就是他们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,此时我们可以运用面向对象(OO)的很重要的原则去解决这一的问题,该原则就是——封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了。下面通过一个现实生活中的例子来引出简单工厂模式。
我觉得简单工厂,就是将if else 或者 stwich case 去实例化单独放在一个类里面,方便维护,总比放在 UI 层或者重要的逻辑处理中看起来方便。
并且,若传入参数用配置文件控制,这样大大方便的代码的处理,只需要加一个要实例化的类,更改工厂类,配置就行了,不需要更改其他类的内容。
比如现在 华为,小米,魅族 三个对象都去实现生产手机这个动作。
一般实现方式 : 华为 h = new 华为();
h.造手机();
普通工厂模式:
---违反了单一职责,开闭 等 升级到普通工厂
普通工厂模式:
一个类创建一个实例工厂
升级一下,将工厂定义一个接口
较少了对业务的依赖,原先依赖类,改为依赖工厂
------导致写的代码变多
问题二:一开始觉得普通工厂还是需要先new,只不过是new的工厂,感觉没啥用。并且还将代码变多。
我觉得,当工厂类在中间层和声明对象在UI层时,是有好处的。比如:当传入一个固定参数值时,我们可以直接在工厂类去加参数值,再传入实例化的类,
不用 直接A a =new A(“123”),这时候只需要改工厂类和需要实例化的类,而不需要改UI层。
抽象工厂:
抽象工厂是一组类对象
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存在不足的地方。下面就具体看下抽象工厂的缺点:
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
抽象工厂在确定一组类对象下,可以减少代码,但是无法扩展,只要扩展,就需要改动所用继承抽象工厂的类。
问题三:在这里开始迷糊了,其实用接口也可以实现抽象工厂,那还为什么要用抽象类。具体用接口实现如下:
我觉得这个主要差别在于抽象类与接口的主要差别。
抽象成员 必须包含在抽象类里面,抽象类还可以包含普通成员
继承抽象类后,必须显示的override其抽象成员
------------------------------------------------------------------------
接口只能包含没有实现的方法
实现接口的话,必须实现全部方法
参考如下:
看了许多相关文档,尤其搞不懂这几点为什么?最后还是理解总结了一下,最起码自己能说服自己了。