聊一聊java设计模式

122 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情

每日英语:

Success is the sum of small efforts - repeated day in and day out.

成功是日复一日的努力的总和。 -罗伯特·科利尔

Java设计模式是一组被广泛使用的软件设计原则和模式,旨在帮助开发人员创建高质量、易于维护和可扩展的代码。本文将介绍几种常见的Java设计模式,并提供相应的Java代码示例。

单例模式

单例模式是一种创建模式,它确保一个类只有一个实例,并提供对该实例的全局访问。这种模式通常用于管理资源或控制对共享资源的访问。

以下是单例模式的Java代码实现:

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // 私有构造函数
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上面的代码中,Singleton类只有一个私有构造函数,这意味着它不能被实例化。getInstance()方法使用一个静态变量instance来存储唯一实例,并在第一次调用时创建该实例。以后的调用将返回相同的实例。

工厂模式

工厂模式是一种创建模式,它提供一种用于创建对象的通用接口,但允许子类决定要实例化的类。这种模式通常用于隐藏对象的创建逻辑,从而使客户端代码更具可读性和可维护性。

以下是工厂模式的Java代码实现:

public interface Shape {
    void draw();
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        }
        return null;
    }
}

在上面的代码中,Shape是一个接口,它有一个draw()方法。RectangleCircle是两个实现该接口的类。ShapeFactory类提供了一个getShape()方法,它根据传入的参数创建相应的对象。

观察者模式

观察者模式是一种行为模式,它定义了对象之间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知并自动更新。

以下是观察者模式的Java代码实现:

import java.util.ArrayList;
import java.util.List;

public interface Observer {
    void update();
}

public class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;
    
    public int getState() {
        return state;
   }

   public void setState(int state) {
        this.state = state;
        notifyAllObservers();
   }

   public void attach(Observer observer) {
        observers.add(observer);
   }

   public void notifyAllObservers() {
       for (Observer observer : observers) {
           observer.update();
       }
   }
}
public class BinaryObserver implements Observer { 
    private Subject subject;
    
    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary string: " + Integer.toBinaryString(subject.getState()));
    }
}

public class OctalObserver implements Observer { 
    private Subject subject; 
    
    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Octal string: " + Integer.toOctalString(subject.getState()));
    }
}
public class HexObserver implements Observer { 
    private Subject subject;
    
    public HexObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Hex string: " + Integer.toHexString(subject.getState()));
    }
}

在上面的代码中,Subject是一个主题类,它维护一个观察者列表并提供注册、删除和通知观察者的方法。Observer是一个观察者接口,它定义了一个update()方法,该方法在主题状态发生更改时被调用。BinaryObserverOctalObserverHexObserver是三个具体的观察者实现,它们在收到主题通知时输出主题状态的不同进制形式。

总结

Java设计模式是一组有用的模式,可以帮助开发人员创建高质量、易于维护和可扩展的代码。本文介绍了几种常见的Java设计模式,并提供了相应的Java代码示例。这些模式分别是单例模式、工厂模式和观察者模式。如果您是Java开发人员,建议您熟练掌握这些模式,以提高您的编码技能和代码质量。