Java面試題中的設(shè)計(jì)模式問(wèn)題

小樊
83
2024-06-16 01:22:06

  1. 請(qǐng)簡(jiǎn)要介紹單例模式的概念及其在Java中的實(shí)現(xiàn)方式。

單例模式是一種創(chuàng)建型設(shè)計(jì)模式,確保類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。在Java中,實(shí)現(xiàn)單例模式通常有以下幾種方式:

  • 餓漢式單例:在類(lèi)加載時(shí)就創(chuàng)建實(shí)例,線(xiàn)程安全,但可能造成資源浪費(fèi)。
  • 懶漢式單例:在首次調(diào)用時(shí)創(chuàng)建實(shí)例,存在線(xiàn)程安全問(wèn)題,需要加鎖進(jìn)行同步。
  • 雙重檢查鎖單例:在懶漢式基礎(chǔ)上加鎖,提高性能。
  • 靜態(tài)內(nèi)部類(lèi)單例:使用靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)延遲加載,線(xiàn)程安全。
  1. 什么是工廠模式?請(qǐng)給出一個(gè)在Java中實(shí)現(xiàn)工廠模式的例子。

工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,用于創(chuàng)建對(duì)象的接口,但讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)。在Java中,工廠模式通常包含一個(gè)接口和多個(gè)實(shí)現(xiàn)該接口的工廠類(lèi),示例代碼如下:

// 接口
public interface Shape {
    void draw();
}

// 實(shí)現(xiàn)類(lèi)
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle.draw()");
    }
}

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

// 工廠類(lèi)
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("Circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("Rectangle")) {
            return new Rectangle();
        }
        return null;
    }
}

// 使用工廠類(lèi)創(chuàng)建對(duì)象
public class FactoryPatternDemo {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.createShape("Circle");
        Shape rectangle = ShapeFactory.createShape("Rectangle");
        
        circle.draw();
        rectangle.draw();
    }
}
  1. 什么是觀察者模式?請(qǐng)給出一個(gè)在Java中實(shí)現(xiàn)觀察者模式的例子。

觀察者模式是一種行為設(shè)計(jì)模式,定義了一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),其所有依賴(lài)者都會(huì)收到通知并自動(dòng)更新。在Java中,可以使用Java內(nèi)置的Observer和Observable類(lèi)實(shí)現(xiàn)觀察者模式,示例代碼如下:

// 被觀察者
public class Subject extends Observable {
    private int state;

    public int getState() {
        return state;
    }

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

// 觀察者
public class Observer implements java.util.Observer {
    public void update(Observable o, Object arg) {
        System.out.println("State changed to: " + arg);
    }
}

// 使用觀察者模式
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();

        Observer observer1 = new Observer();
        Observer observer2 = new Observer();

        subject.addObserver(observer1);
        subject.addObserver(observer2);

        subject.setState(1);
        subject.setState(2);
    }
}

在上述例子中,Subject類(lèi)繼承自O(shè)bservable類(lèi),用于管理觀察者列表并通知觀察者狀態(tài)變化;Observer類(lèi)實(shí)現(xiàn)了java.util.Observer接口,用于接收被觀察者的通知。通過(guò)使用Observer和Observable類(lèi),可以方便地實(shí)現(xiàn)觀察者模式。

0