谈谈Java的设计模式
设计模式
设计模式是什么?
设计模式是我们对问题所提出的解决方案,就像一个个蓝图,通过对问题的一些综合考虑,采用最合适的设计方案来解决问题。就像一个工具箱,我们要看具体的情况,来决定使用哪把工具。那么设计模式是如何诞生的呢,设计模式最开始也是一个解决方案,只不过这个方案在各种项目中得到了验证。最终得到认可,是前辈们一个个试验,一步一个坑踩过来,最终被后人们整理,收纳,所归类的出的一种新领域
设计模式的优点
- 提高我们的思维能力和设计能力
- 使程序的设计变得标准化、流程化,增强开发效率
- 对代码来说,提高了可读性和复用性以及可扩展性
设计模式的六大原则
- 开闭原则 对扩展开放,对修改关闭
- 里氏代换原则 任何基类可以出现的地方,子类一定可以出现
- 依赖倒转原则 对接口编程,依赖于抽象不依赖具体
- 接口隔离原则 使用多个隔离的接口,比使用单个好
- 迪米特法则 一个实体类尽量少与其他实体类有相互作用
- 合成复用原则 尽量使用合成/聚合,不使用继承
设计模式的分类
创建型模式:通过提供创建对象的机制,增加已有代码的灵活性和可复用性
创建型有五种模式:工厂方法、抽象工厂、建造者、原型、单例
结构性模式:如何将对象和类组装成较大的结构,同时保持结构的灵活和高效
结构型有七种模式:适配器、桥接、组合、装饰、外观、享元、代理
行为模式:负责对象间的高效沟通和职责委派
行为型有十一种模式:责任链、命令、迭代器、解释器、中介者、备忘录、观察者、状态、策略、模板方法、访问者
现在我们对设计模式有了初步认识,下面我们对每一种设计模式进行详细了解,并逐一举例
创建型
工厂方法(Factory Method)
将实例化交给工厂类的实现类,实现类负责创建对象。这样就符合了开闭原则,之后我们扩展的时候,只需要创建一个对象,创建工厂,从工厂获取就可以,避免了在原本代码中修改的操作。
以汽车举例
- 创建汽车接口,定义好汽车的基本属性,例如颜色、速度
- 实现汽车接口,例如奔驰实现汽车接口,将汽车接口中的颜色和速度重写为奔驰的基本信息
- 创建工厂接口,因为我们所有的车都需要在工厂中生产
- 创建一个奔驰工厂,实现工厂的接口,这样奔驰就可以把车交给工厂去生产了
- 用户买车直接找奔驰工厂就可以,通过奔驰工厂可以拿到奔驰对象,不关注是如何造出来的
在工厂方法中,如果我们想加入奥迪这个品牌,只需要创建奥迪的对象,实现汽车接口,创建一个奥迪工厂实现工厂接口,就可以通过奥迪工厂获取到奥迪对象。但缺点也很明显,随着我们的需求增多,类和接口也越来越多,代码整体相对复杂一点。
抽象工厂(Abstract Factory)
简单的来说就是创建工厂的工厂,主要用来创建家族产品。一个产品族的接口,每个子类都可以实现产品
以产品举例子 产品可以有很多,比如手机、显示器、路由器等等。
- 创建产品接口,定义好产品的基本属性
- 实现产品接口,例如小米实现手机接口,也可以实现显示器接口…
- (核心)创建一个超级工厂接口,用来生产产品,例如上述的手机、显示器和路由器
- 创建小工厂,例如小米工厂,华为工厂等等,这些工厂都要实现超级工厂。这样超级工厂里的商品就可以给小米工厂制造了
- 客户直接去找小米工厂可以获取所有的小米商品,华为则获取所有的华为商品
例如现在小米和华为都想再生产一个鼠标,那么只需要创建一个产品接口,让小米和华为去实现该接口,之后在超级工厂中加入鼠标这个商品,小米工厂和华为工厂就可以生产鼠标这个商品了。相对于工厂方法改动少了,但每次修改超级工厂,都要修改下面的子类,还是存在一些麻烦
建造者(Builder)
建造者模式更注重构建对象的这个过程,通过分步创建一个复杂的对象,将产品的创建与产品的本身进行分离,构建的过程就可以获得不同的对象。在代码中使用链式调用,方便的同时增加了可读性。我们一般通过建造者模式来创建那些有非传参数的对象。
待续…