设计模式(一)--编程界的九阳神功

news/2024/10/15 20:25:54/

在学习设计模式前,我们先要弄明白一个问题,那就是为什么要学习设计模式?在JAVA领域,大部分使用的是贫血模型,业务逻辑都是service之间的调用,类似于函数式编程,其他高深的东西都封装于框架中,平时能用上设计模式的地方确实不多,似乎学习了也没啥用。

我觉得设计模式特别像九阳神功,练成「九阳神功」后,内力自生速度奇快,无穷无尽,普通拳脚也能使出绝大攻击力,学习了设计模式,虽然还是普通的功能,却在稳定性,可维护性上大不相同了。

九阳神功是融会贯通武学体系,练成后天下武学皆附拾可用。学会了设计模式,再看各种开源框架源码,就能融会贯通,明白作者为什么要这么写,并且为已所用。

设计模式总览

 七大设计原则

开闭原则,软件实体应当对扩展开放,对修改关闭,扩展新类而不是修改旧类

里氏替换原则,继承必须确保超类所拥有的性质在子类中仍然成立,继承父类而不去改变父类

依赖倒置原则,高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,面向接口编程,而不是面向实现类

单一职责原则,一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分,每个类只负责自己的事情,而不是变成万能

接口隔离原则,一个类对另一个类的依赖应该建立在最小的接口上,各个类建立自己的专用接口,而不是建立万能接口

迪米特法则,只与你的直接朋友交谈,不跟“陌生人”说话,无需直接交互的两个类,如果需要交互,使用中间者

合成复用原则,软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

单例模式

一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。

单例特点

某个类只能有一个实例;(构造器私有)

它必须自行创建这个实例;(自己编写实例化逻辑)

它必须自行向整个系统提供这个实例;(对外提供实例化方法)

使用场景

多线程中的线程池

数据库的连接池

系统环境信息

上下文(ServletContext) ......

接下去看下经典的懒汉模式的单例代码

public class SingleObject {//使用volatile保证内存可见性,防止指令重排private volatile static SingleObject instance;//私有构造器,外部无法newprivate SingleObject() {}public static SingleObject getInstance() {//判断是否已有实例,没有则创建实例if (instance == null) {//多线程情况下需要加锁synchronized (SingleObject.class) {//防止多个线程走到这里,所以还需要判断一次if (instance == null) {instance = new SingleObject();}}}return instance;}
}

工厂模式

提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂

简单工厂

简单工厂的核心代码就是MouseFactory的createMouse,通过传入不同的type来返回不同的Mouse

 

public abstract class Mouse {public abstract void sayHi();public void test() {System.out.println("测试工作");}
}public class DellMouse extends Mouse {@Overridepublic void sayHi() {System.out.println("DellMouse");}
}public class HpMouse extends Mouse {@Overridepublic void sayHi() {System.out.println("HpMouse");}
}public class SimpleMouseFactory {//创建mouse对象public static Mouse createMouse(int type) {Mouse mouse = null;if (type == 0) {mouse = new DellMouse();} else if (type == 1) {mouse = new HpMouse();} else {throw new IllegalArgumentException();}//出厂测试mouse.test();return mouse;}@Testpublic void testCreate() {Mouse mouse = createMouse(0);mouse.sayHi();mouse = createMouse(1);mouse.sayHi();}
}

现在思考一个问题,为什么要用工厂模式,而不是直接new一个HpMouse或者DellMouse呢?

首先,根据依赖倒置原则,我们应该依赖抽象,而不是具体的类,直接new一个就是依赖于具体的类了。其次工厂模式可以在产品出厂前做一些特殊处理,比如测试工作,这个很重要,Spring的很多重要功能都依赖于此。我们知道Spring里面有个bean工厂,而它生产的不是原始对象,而是代理对象,只有通过代理对象才能实现面向切面编程,后面的拦截器,事务处理等才有了实现的可能。理解了上面两点,也就理解了工厂模式。

简单工厂有个缺点就是如果添加新的产品,需要修改createMouse方法,也就违反了开闭原则。这个时候就可以使用工厂模式。

工厂模式

工厂模式就是把MouseFactory作为抽象类,每一种产品都新建一个工厂类,一个工厂类只生成一种产品,这样当有新的产品时,只需要新建一个工厂类就行了。

 

public abstract class MouseFactory {public abstract Mouse createMouse();static class HpMouseFactory extends MouseFactory {@Overridepublic Mouse createMouse() {return new HpMouse();}}static class DellMouseFactory extends MouseFactory {@Overridepublic Mouse createMouse() {return new DellMouse();}}public static void main(String[] args) {HpMouseFactory hpMouseFactory = new HpMouseFactory();DellMouseFactory dellMouseFactory = new DellMouseFactory();Mouse mouse = hpMouseFactory.createMouse();mouse.sayHi();mouse = dellMouseFactory.createMouse();mouse.sayHi();}
}

抽象工厂模式

工厂模式有个限制就是只能生产一类的产品,如果想又生产鼠标又生产键盘该怎么办呢?这时就要用到抽象工厂了,把生产鼠标和键盘的方法放在抽象工厂类中,下面的实现类来决定具体生产哪一种产品。

 

public abstract class PcFactory {abstract Mouse createMouse();abstract Keybo createKeybo();static class HpFactory extends PcFactory {@OverrideMouse createMouse() {return new HpMouse();}@OverrideKeybo createKeybo() {return new HpKeybo();}}static class DellFactory extends PcFactory {@OverrideMouse createMouse() {return new DellMouse();}@OverrideKeybo createKeybo() {return new DellKeybo();}}public static void main(String[] args) {DellFactory dellFactory = new DellFactory();Mouse mouse = dellFactory.createMouse();mouse.sayHi();Keybo keybo = dellFactory.createKeybo();keybo.sayHi();}
}


http://www.ppmy.cn/news/234128.html

相关文章

修炼你的《九阳神功》行走江湖

据香港文汇网10月30日报道,武侠小说泰斗金庸(原名查良镛)当天下午病逝于香港养和医院,享年94岁。消息一经发布,震荡了两岸三地。 从1955年使用笔名“金庸”连载武侠小说处女座《书剑恩仇录》开始,到1972年…

九阳神功是如何炼成的!

在金旭亮老师的博客上看到一个贴子,在此转载分享一下。 原文如下: ASP.NET 技术的学习顺序问题 前前后后收到过一些学生的来信,询问ASP.NET的学习顺序问题,在此就向打算系统学习ASP.NET技术的初学者谈谈我的建议。 如果你已经有较…

编程基础知识真的是九阳神功吗?

作者|大飞码字 来源|大飞码字(ID:BigFly1024) 有不少读者咨询过基础知识相关的问题。 有问怎么能够学好基础知识,有问基础知识到底有什么用,也有直接过来喷我,说工作只有CRUD&#x…

苹果app商品定价_iOS 开发_2017苹果内购价格表

【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进! 1.应用场景: 使用苹果内购的APP/游戏 2.实现目标…

ios 苹果支付(IAP)

一.简介 什么是IAP,即in-app-purchase。(虚拟商品如:课程、视频、音乐等数字产品只能走apple 的内购),苹果要扣除30%的销售额,再扣除一点相关的交易税,用户到手将不到7成。 官方参考文档 内购流程 1.获取内购列表(从…

java 苹果cms 萌果_苹果cms打包app

苹果cms打包app zxnjfh 苹果cms打包app遵循一屏一概规则如果信息准确且专注,人们就能够更容易地吸收信息,入门屏幕应该分块信息,使用单个屏幕来描述概念,以避免用户使用信息过载,这种做法对于面向功能和以利益为导向的…

JAVA基于JSP的在线人才招聘求职系统【数据库设计、论文、源码、开题报告】

主要使用技术 ServletJSPCSSJSMysql 数据库脚本 /* SQLyog Ultimate v9.30 MySQL - 5.5.40 : Database - jsp_qzzp_sys ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_U…

windows10正版多少钱_惠安正版OA系统好不好用,高性价比无纸化办公系统大概多少钱_泉州登泽...

惠安正版OA系统好不好用,高性价比无纸化办公系统大概多少钱,的“智能型办公自动化系统”将成为未来的发展方向,智能型OA能够提供决策支持知识挖掘商务智能等服务,并且更关注企业的决策效率。阶段2011年后,智能型办公自动化。随着企业组织流程…