Java中常见的设计模式(持续更新中)


介绍

是一套被反复使用,多数人知晓,经过分类编目的,代码设计经验的总结
使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性,程序的重用性
简单的说就是一套良好的编码风格,通过众多开发人员,长时间测试,经验总结而来,不同的设计模式也有不同的好处

模板设计模式

介绍

把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义为抽象方法,让使用模板的类(继承抽象类的类)去重写抽象方法实现需求。

优势

模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可

代码

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();
}

装饰者设计模式

介绍

不改变原类,在不继承的基础上,动态的扩展一个对象的功能(功能增强)

套路

  1. 装饰类和被装饰类需要共同的父类型
  2. 装饰类的构造要接收被装饰类的对象
  3. 在装饰类中把要增强扩展的功能进行扩展
  4. 对于不要增强的功能直接引用

代码

//介绍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();//调用原有功能
}



}

单例设计模式

介绍

正常情况下一个类就可以创建多个对象,但是有时候一个对象就能搞定的事情,创建多个对象就会浪费内存
通过单例模式创建的项目的类,这个类只能有一个对象,可以节省内存,共享数据

步骤

  1. 将构造方法私有化,使其外部不能通过new关键字创建该类的对象
  2. 定义一个静态方法返回这个唯一对象
  3. 在该类内部创建一个唯一的实例化对象

分类

  1. 饿汉式(使用类的时候已经将对象创建完毕) 很着急的样子
  2. 懒汉式(在调用该静态方法的时候才会创建对象) 不着急

代码

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;
    }

}

多例设计模式

介绍

通过多例模式可以保证该类有固定数量的实例
应用:线程池

步骤

  1. 创建一个类,将其构造方法实例化,使其不能在类的外部通过new创建对象
  2. 在类中定义该类被创建对象的总数量
  3. 在类中定义存放类实例的list集合
  4. 在类中提供静态代码块,在静态代码块中创建类的实例
  5. 提供静态方法让外部获取实例

代码

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. 编写子类1实现接口,重写其方法
  3. 编写子类2实现接口,重写其方法
  4. 编写一个接口工厂类
    1. 类中私有化构造方法
    2. 定义静态方法来让外部创建对象

代码

public interface Car {

    void run();
}

public class Falali implements Car{
    @Override
    public void run() {
        System.out.println("法拉利破百仅需3秒");
    }
}

public class Audi implements Car{
    @Override
    public 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配置文件中读取来进行获取,这样就可以更改配置文件来更改对象,实现解耦

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Zeal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值