简单工厂模式
用方法调用获取对象来替换new的方式创建对象,虽然本质上也是用new,代码如下:
通过调用方法的方式来获取对应的对象。
优点:
原先通过new的方式创建对象,假设对象发生变化,new的对象变了,就需要去修改new的地方,如果创建对象需要10个参数,我们用new就需要每次都写一遍。
1.解耦合
使用工厂模式后,调用方就可以只关注对象的使用,每次使用直接工厂获取,不用管对象是如何创建的
2.降低代码复杂度
之前每次new都要写入参,使用工厂后,只需要在工厂里写一次。
假设咱们的工厂老板姓孙,他很强大,不仅仅一个厂子能生产五菱还能生产奥迪,但是某一天,最近又出卖美色,拿下了粪叉的生产权。如上的写法只能去改变工厂类本身,这其实是不好的,违反了开闭原则。在原先的工厂里扩建一个新的产业链说不定还会影响到别的产业的生产,用专业语言就是所有的工厂在一个类里,也是一种耦合。所以工厂方法模式产生了。
工厂方法模式
工厂接口:
对应的实现类
具体使用:
这种写法将工厂概念定义为接口,具体的负责某个产品的工厂去实现这个接口,将每个工厂的逻辑独立起来,接除耦合,这里可能有人要说了,直接创建对象也是创建,创建工厂对象也是创建,工厂方法模式优点在哪里啊。
优势
代码量
创建jdbc工厂获取链接,和直接newjdbc对象设置参数,那个代码复杂还用说吗,虽然都是需要创建对象,代码量亦有区别,
解耦合,
如果某天业务该变,生产的对象需要替换,也仅仅是修改工厂就可以达到全局替换的目的,使用对象和创建对象解耦,工厂与工厂解耦,各个工厂可以独特的去实现一些细节,
符合单一职责和开闭原则。
抽象工厂模式。
产品族
孙老板又开了一家GG蛋糕店,用来做蛋糕,蛋糕店工厂实现了蛋糕店接口的做蛋糕方法,开始售卖GG蛋糕。但是有一天孙老板发现蛋糕店居然不止能卖蛋糕还能卖冰淇凌。这时候怎么办呢,难道再去建一个冰淇凌店吗,明明都是GG牌的,于是孙老板在GG蛋糕店定义了生产GG冰淇凌的方法。这就是抽象工厂模式里面的产品族的定义,同一家店生产的东西称之为一族。
产品等级
GG蛋糕店和Win蛋糕店都卖蛋糕,蛋糕就是产品等级。
抽象工厂模式和工厂模式在工厂结构上并没有太大差别。只是增加了创建别的产品的方法。
这里除了生产汽车外,还生产空气了。
实现工厂类:
期间加入了对于产品等级的定义,将同一产品等级的对象的共有方法抽出。形成抽象类:
具体的产品实现这个类
为了解耦合开闭原则和单一职责这些原理,很明显,我们加大了理解难度。而且如果类比较单一,也不太适合用抽象工厂。适合出现了产品族和产品等级的场景。
反射加配置文件加抽象工厂
在使用时,我们发现每次我们都要手动指定具体的工厂。然后再去调用方法创建对象,如果有变化,我们又要手动替换这些工厂和对象。灵活性不足。这时就需要反射加配置文件加抽象工厂来解决了。
跟据配置文件中的产品名和品牌名,来直接创建出对象使用。(暂无代码dd)