文章目录
- 介绍
- 模板设计模式
- 介绍
- 优势
- 代码
- 装饰者设计模式
- 介绍
- 套路
- 代码
- 单例设计模式
- 介绍
- 步骤
- 分类
- 代码
- 多例设计模式
- 介绍
- 步骤
- 代码
- 工厂设计模式
- 介绍
- 步骤
- 代码
介绍
是一套被反复使用,多数人知晓,经过分类编目的,代码设计经验的总结
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性,程序的重用性
简单的说就是一套良好的编码风格,通过众多开发人员,长时间测试,经验总结而来,不同的设计模式也有不同的好处
模板设计模式
介绍
把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义为抽象方法,让使用模板的类(继承抽象类的类)去重写抽象方法实现需求。
优势
模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
代码
public abstract class Demo {public void writeZuoWen(){head();middle();end();}private void head(){System.out.println("作文的开头");}private void end(){System.out.println("作文的结尾");}public abstract void middle();
}
装饰者设计模式
介绍
不改变原类,在不继承的基础上,动态的扩展一个对象的功能(功能增强)
套路
- 装饰类和被装饰类需要共同的父类型
- 装饰类的构造要接收被装饰类的对象
- 在装饰类中把要增强扩展的功能进行扩展
- 对于不要增强的功能直接引用
代码
//介绍BufferReader 提高读的效率//场景:在使用FileReader类时,发现读的效率低,希望提高效率
//不能修改FileReader类,不能继承FileReader类,要对read(char[] cbuf)方法进行增强//使用装饰者设计模式
//装饰类:BufferReader 被装饰类:FileReader
//他俩都由共同的父类Reader
public class BufferedReader extends Reader(){private FileReader fileReader;public BufferedReader(FileReader fileReader){this.fileReader = fileReader;
}//成员变量
private int size = 1024*8;//缓冲区对象
char[] cbuf = new char[size];//重写read()方法
public int read(){read(cbuf);
}//重写read(char[] cbuf){
public int read(char[] cbuf){...
}//重写相关方法
public void close(){fileReader.close();//调用原有功能
}}
单例设计模式
介绍
正常情况下一个类就可以创建多个对象,但是有时候一个对象就能搞定的事情,创建多个对象就会浪费内存
通过单例模式创建的项目的类,这个类只能有一个对象,可以节省内存,共享数据
步骤
- 将构造方法私有化,使其外部不能通过new关键字创建该类的对象
- 定义一个静态方法返回这个唯一对象
- 在该类内部创建一个唯一的实例化对象
分类
- 饿汉式(使用类的时候已经将对象创建完毕) 很着急的样子
- 懒汉式(在调用该静态方法的时候才会创建对象) 不着急
代码
public class King1 {private static King1 king1 = new King1();private King1(){}public static King1 getInstance(){return king1;}}
public class King2 {private static King2 king2;private King2(){}public synchronized static King2 getInstance(){if (king2 == null){king2 = new King2();}return king2;}}
多例设计模式
介绍
通过多例模式可以保证该类有固定数量的实例
应用:线程池
步骤
- 创建一个类,将其构造方法实例化,使其不能在类的外部通过new创建对象
- 在类中定义该类被创建对象的总数量
- 在类中定义存放类实例的list集合
- 在类中提供静态代码块,在静态代码块中创建类的实例
- 提供静态方法让外部获取实例
代码
public class Teacher {private Teacher(){}private static int size = 3;private static List<Teacher> teachers = new ArrayList<>();static {for (int i = 0; i < size; i++) {teachers.add(new Teacher());}}public static Teacher getInstance(){return teachers.get(new Random().nextInt(teachers.size()));}//要想像线程池那样public static Teacher getInstance(int size){int count = teachers.size();int result = size - count;if (result > 0){for (int i = 0; i < result; i++) {teachers.add(new Teacher());}}return getInstance();}}
工厂设计模式
介绍
是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。
作用:类与类之间进行解耦
步骤
- 编写一个接口,定义一个方法
- 编写子类1实现接口,重写其方法
- 编写子类2实现接口,重写其方法
- 编写一个接口工厂类
- 类中私有化构造方法
- 定义静态方法来让外部创建对象
代码
public interface Car {void run();
}
public class Falali implements Car{@Overridepublic void run() {System.out.println("法拉利破百仅需3秒");}
}
public class Audi implements Car{@Overridepublic void run() {System.out.println("奥迪RS7破败仅需3.8秒");}
}
public class CarFactory {private CarFactory() {}public static Car getInstance(String name) {Car car = null;if ("Falali".equals(name)){car = new Falali();}else if ("Audi".equals(name)){car = new Audi();}return car;}
}
后续测试中name可以在.properties配置文件中读取来进行获取,这样就可以更改配置文件来更改对象,实现解耦