0、设计模式前篇
祝大家码上升职加薪,码上有车有房,幸福安康
1.UML类图
图形化工具:Enterprise Architect 9.2
关系:
关联关系:描述不同类对象之间的一种关系,例如:一根实线,学生和身份证是相互关联
依赖关系:描述一个对象在运行期间会用到另一个对象,例如:带箭头的虚线,学生依赖于自行车
实现关系:在现实中并无法直接用来定义对象;只有指明具体的子类,才可以用来定义对象,例如:带空心箭头的虚线,车由自行车来实现其具体的功能
泛化关系:表现出一种被继承的关系,例如:带空心箭头的实线,小汽车泛化SUV,更加具体化
聚合关系:表示整体由部分构成的语义,例如:带空心箭头的实线,学生聚合到班级上
组合关系:表示整体由部分构成的语义,带实心箭头的实线,发动机和轮胎组成小汽车
泛化≠继承,例如:
苹果继承水果;
水果泛化苹果;
设计模式的编码例子,出现最多的是单例模式、工厂模式和代理模式
常见的模式:单例、工厂、代理模式、策略、建造者、命令
2、单例设计模式:
1、什么是单例设计模式?
定义:保证一个类中只有一个实例
2、什么情况下使用?
有些对象只有一个,比如配置文件,工具类,线程池,缓存,日志对象等
懒汉式:指全局的实例在第一次使用时构建
饿汉式:指全局的实例在类装载时构建
注:日常我们使用较多的应该是懒汉式的单例,毕竟按需加载才能做到资源的最大化利用
3、具体实现方式?
//懒汉式单例 public class Single { private static volatile Single instance; private Single() {} public static Single getInstance() { if (instance == null) { synchronized (Single.class) { if (instance == null) { instance = new Single(); } } } return instance; } }
把构造器改为私有的,这样能够防止被外部的类调用。
当多线程工作的时候,如果有多个线程同时运行到if (instance == null),都判断为null,那么两个线程就各自会创建一个实例——这样一来,就不是单例了。
给getInstance方法加锁,虽然会避免了可能会出现的多个实例问题,但是会强制除T1之外的所有线程等待,实际上会对程序的执行效率造成负面影响。
//饿汉式单例 public class Single1 { private static final Single1 INSTANCE = new Single1(); private Single1() {} public static Single1 getInstance() { return INSTANCE; }
volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作。
4、工厂模式:实例化对象
概念
1.一个鞋厂,可以生产多种鞋子。
2.一个接口,可以被多个实现类实现。
分类:
1、简单工厂:可根据自变量的不同返回不同类的实例。
将类名和类的全路径放入到配置文件,通过文件流将内容读取放入到map集合中保存,通过反射读取类全路径读取到该类,然后调用类方法。
角色:产品接口、具体产品类、产品工厂类
2、工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
角色:产品接口、具体产品类、工厂接口,具体工厂类
3、抽象工厂:提供一系列或相互依赖的对象的接口
创建电视和汽车接口,创建具体类来实现,然后创建工厂接口,创建具体工厂类实现工厂接口,在测试类中创建具体工厂类,调用其中的方法。
角色:抽象类接口、具体类、工厂接口、具体工厂类
这三种模式从上到下逐步抽象,并且更具一般性。
作用:
1、把对象的创建和使用的过程分开;
2、降低代码的重复;
3、减少代码逻辑的错误;
https://www.cnblogs.com/baxianhua/p/9353591.html
5、代理模式
1、定义:
代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。
根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。
https://www.cnblogs.com/boboxing/p/8126046.html
比较器
实现Comparator重写compare方法,定义两个变量
Arrays.sort(sortArray, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getsScore() - o2.getsScore(); } });
实现Comparable重写compareTo方法,定义一个变量
代理模式
代理:把一些常见的东西封装起来,让编译器去做。
为某个对象提供代理,以控制对这个对象的访问。
代理类:经纪人
委托类:歌手
代理类和委托类有共同的父类或父接口
代理模式跟过滤器有相同的思想。
6、建造者模式
将多个简单对象建造成一个复杂的对象
需求:在解决软件系统中,有时一个复杂对象的创建,需要多个分对象运用一种算法构建而成。
何时使用:一些基本组件不变,而组合经常改变
应用实例:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、JAVA 中的 StringBuilder。