1. 程式人生 > 實用技巧 >設計模式(上)

設計模式(上)

什麼是設計模式?

設計模式,在軟體工程中是對軟體設計過程中普遍存在的問題,所提出的解決方案。

設計模式分類

GoF設計模式一共23種,分為三大類:建立型模式、結構型模式、行為型模式。

常用的設計模式

1.工廠模式(Factory Pattern)

工廠模式是Java中最常用的設計模式之一。這種設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,建立物件時不會對客戶暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

例項:

// 介面
public interface Shape { void draw(); }

  

// 實現類
public class Circle implements  Shape{
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

  

// 實現類
public class Square implements  Shape {

    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

  

// 工廠類
public class ShapeFactory {

    public Shape getShape(String shapeType){

        if( "Square".equals(shapeType)){
            return new Square();
        }else if("Circle".equals(shapeType)){
            return new Circle();
        }else {
            return null;
        }

    }
}

  

// Demo
public class FactoryPatternDemo {

    public static void main(String[] args) {
ShapeFactory factory = new ShapeFactory(); Shape square = factory.getShape("Square"); Shape circle = factory.getShape("Circle"); square.draw(); circle.draw(); } }

  

// 程式輸出結果
Inside Square::draw() method.
Inside Circle::draw() method.

  

2.抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式是圍繞一個超級工廠建立其他的工廠。該超級工廠又稱為其他工廠的工廠。

這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯示指定他們的類,每個生成的工廠都能按照工廠模式提供物件。

例項:

// 介面
public interface Shape { void draw(); }

  

// 實現類
public class Circle implements  Shape{
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

  

// 實現類
public class Square implements  Shape {

    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

public interface Color {
    void fill();
}

  

public class Red implements  Color {

    public void fill() {
        System.out.println("Inside Red::fill() method.");
    }
}

  

public class Blue implements Color {
    public void fill() {
        System.out.println("Inside Blue::fill() method.");
    }
}

public abstract class AbstractFactory {

    public abstract Shape getShape(String shape) ;

    public abstract Color getColor(String color) ;

}

  

public class ShapeFactory extends AbstractFactory{

    public Shape getShape(String shapeType){

        if( "Square".equals(shapeType)){
            return new Square();
        }else if("Circle".equals(shapeType)){
            return new Circle();
        }else {
            return null;
        }

    }

    public Color getColor(String color) {
        return null;
    }
}

  

public class ColorFactory extends  AbstractFactory{

    public Color getColor(String color){

        if( "Red".equals(color)){
            return new Red();
        }else if("Blue".equals(color)){
            return new Blue();
        }else {
            return null;
        }

    }

    public Shape getShape(String shape) {
        return null;
    }
}

  

public class AbstractFactoryPatternDemo {

    public static void main(String[] args) {

        ShapeFactory shapeFactory = new ShapeFactory();

        ColorFactory colorFactory = new ColorFactory();

        Shape square = shapeFactory.getShape("Square");

        Shape circle = shapeFactory.getShape("Circle");

        Color red = colorFactory.getColor("Red");

        Color blue = colorFactory.getColor("Blue");

        square.draw();

        circle.draw();

        red.fill();

        blue.fill();

    }
}

  

// 輸出結果
Inside Square::draw() method.
Inside Circle::draw() method.
Inside Red::fill() method.
Inside Blue::fill() method.

  

3.單例模式(Singleton Pattern)

單例模式是Java中最簡單的設計模式之一。

這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

單例模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

注意:

  單例類只能有一個例項

  單例類必須自己建立自己的唯一例項

  單例類必須給所有其他物件提供這一例項

例項:

public class SingleObject {

    // 建構函式為私有的,該類就不會被例項化
    private SingleObject(){};

    // 自己建立自己的唯一例項
    private static  SingleObject singleObject = new SingleObject();

    // 獲取唯一可用的物件
    public static SingleObject getSingleObject(){
        return  singleObject;
    }

    public void show(){
        System.out.println("SingleObject.show()");
    }

}

  

public class SingletonPatternDemo {
    public static void main(String[] args) {
        // 編譯期報錯
        // SingleObject singleObject = new SingleObject();

        SingleObject singleObject = SingleObject.getSingleObject();

        singleObject.show();
    }
}

  

// 程式碼執行結果
SingleObject.show()

  

懶漢式:

// 懶漢式單例
public class LazySingletonPattern {
    // 私有的無參構造方法
    private LazySingletonPattern(){}

    // 預設不例項化,什麼時候用什麼時候例項化
    private static LazySingletonPattern lazySingletonPattern = null;

    //  獲取唯一可用的物件
    public static LazySingletonPattern getLazySingletonPattern(){
        if(lazySingletonPattern == null){
            lazySingletonPattern = new LazySingletonPattern();
        }
        return lazySingletonPattern;
    }
}

  

餓漢式

// 餓漢式單例
public class HungrySingletonPattern {
    // 無參構造方法私有化
    private HungrySingletonPattern (){}
    
  // 直接例項化 private static final HungrySingletonPattern hungrySingletonPattern = new HungrySingletonPattern();
  // 獲取唯一可用的物件 public static HungrySingletonPattern getHungrySingletonPattern(){ return hungrySingletonPattern; } }

  

4.建造者模式(Builder Pattern)

建造者模式,使用多個簡單的物件一步一步構建成一個複雜的物件。

一個Builder類會一步一步構造最終的物件。該Builder類是獨立於其他的物件。

5.原型模式(Prototype Pattern)

原型模式,用於建立重複的物件,又可以保證效能。

原型模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件代價比較大時,使用這種模式。

例如:一個物件需要在一個高代價的資料庫操作之後建立。我們可以先快取該物件,在下一個請求時返回他的克隆,在需要的時候更新資料庫,以此來減少資料庫的呼叫。