Java之設計模式

一.單例模式
一個應用程序中,某個類的實例對象只有一個,你沒有辦法去new,因爲構造器是被private修飾的,一般通過getInstance()的方法來獲取它們的實例。
1.懶漢式寫法(線程不安全)

public class Singleton {

private static Singleton singleton;

private Singleton() {
}

public static Singleton getInstance() {
 if (singleton == null) {
  singleton = new Singleton();
 }
 return singleton;
}
}

2.懶漢式寫法(線程安全)

public class Singleton {  
   private static Singleton instance;  
   private Singleton (){}  
   public static synchronized Singleton getInstance() {  
   if (instance == null) {  
       instance = new Singleton();  
   }  
   return instance;  
   }  
}

3.餓漢式寫法


public class Singleton {  
   private static Singleton instance = new Singleton();  
   private Singleton (){}  
   public static Singleton getInstance() {  
   return instance;  
   }  
}

二.觀察者模式
對象間一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
假設有三個人,小美(女,22),小王和小李。小美很漂亮,小王和小李是兩個程序猿,時刻關注着小美的一舉一動。有一天,小美說了一句:“誰來陪我打遊戲啊。”這句話被小王和小李聽到了,結果樂壞了,蹭蹭蹭,沒一會兒,小王就衝到小美家門口了,在這裏,小美是被觀察者,小王和小李是觀察者,被觀察者發出一條信息,然後觀察者們進行相應的處理。

public interface Person {
   //小王和小李通過這個接口可以接收到小美發過來的消息
   void getMessage(String s);
}

這個接口相當於小王和小李的電話號碼,小美髮送通知的時候就會撥打getMessage這個電話,撥打電話就是調用接口,看不懂沒關係,先往下看

public class LaoWang implements Person {

   private String name = "小王";

   public LaoWang() {
   }

   @Override
   public void getMessage(String s) {
       System.out.println(name + "接到了小美打過來的電話,電話內容是:" + s);
   }

}

public class LaoLi implements Person {

   private String name = "小李";

   public LaoLi() {
   }

   @Override
   public void getMessage(String s) {
       System.out.println(name + "接到了小美打過來的電話,電話內容是:->" + s);
   }

}

代碼很簡單,我們再看看小美的代碼:

public class XiaoMei {
   List<Person> list = new ArrayList<Person>();
    public XiaoMei(){
    }

    public void addPerson(Person person){
        list.add(person);
    }

    //遍歷list,把自己的通知發送給所有暗戀自己的人
    public void notifyPerson() {
        for(Person person:list){
            person.getMessage("你們過來吧,誰先過來誰就能陪我一起玩兒遊戲!");
        }
    }
}

我們寫一個測試類來看一下結果對不對

public class Test {
   public static void main(String[] args) {

       XiaoMei xiao_mei = new XiaoMei();
       LaoWang lao_wang = new LaoWang();
       LaoLi lao_li = new LaoLi();

       //小王和小李在小美那裏都註冊了一下
       xiao_mei.addPerson(lao_wang);
       xiao_mei.addPerson(lao_li);

       //小美向小王和小李發送通知
       xiao_mei.notifyPerson();
   }
}

三.裝飾者模式
對已有的業務邏輯進一步的封裝,使其增加額外的功能。

public class Food {

   private String food_name;

   public Food() {
   }

   public Food(String food_name) {
       this.food_name = food_name;
   }

   public String make() {
       return food_name;
   };
}
//麪包類
public class Bread extends Food {

   private Food basic_food;

   public Bread(Food basic_food) {
       this.basic_food = basic_food;
   }

   public String make() {
       return basic_food.make()+"+麪包";
   }
}

//奶油類
public class Cream extends Food {

   private Food basic_food;

   public Cream(Food basic_food) {
       this.basic_food = basic_food;
   }

   public String make() {
       return basic_food.make()+"+奶油";
   }
}

//蔬菜類
public class Vegetable extends Food {

   private Food basic_food;

   public Vegetable(Food basic_food) {
       this.basic_food = basic_food;
   }

   public String make() {
       return basic_food.make()+"+蔬菜";
   }

}
public class Test {
   public static void main(String[] args) {
       Food food = new Bread(new Vegetable(new Cream(new Food("香腸"))));
       System.out.println(food.make());
   }
}

在這裏插入圖片描述
四.適配器模式
將兩種完全不同的事物聯繫到一起,就像現實生活中的變壓器。
假設一個手機充電器需要的電壓是20V,但是正常的電壓是220V,這時候就需要一個變壓器,將220V的電壓轉換成20V的電壓,這樣,變壓器就將20V的電壓和手機聯繫起來了。

public class Test {
   public static void main(String[] args) {
       Phone phone = new Phone();
       VoltageAdapter adapter = new VoltageAdapter();
       phone.setAdapter(adapter);
       phone.charge();
   }
}

// 手機類
class Phone {

   public static final int V = 220;// 正常電壓220v,是一個常量

   private VoltageAdapter adapter;

   // 充電
   public void charge() {
       adapter.changeVoltage();
   }

   public void setAdapter(VoltageAdapter adapter) {
       this.adapter = adapter;
   }
}

// 變壓器
class VoltageAdapter {
   // 改變電壓的功能
   public void changeVoltage() {
       System.out.println("正在充電...");
       System.out.println("原始電壓:" + Phone.V + "V");
       System.out.println("經過變壓器轉換之後的電壓:" + (Phone.V - 200) + "V");
   }
}

五.工廠模式
一個抽象的接口,多個抽象接口的實現類,一個工廠類,用來實例化抽象的接口。

// 抽象產品類
abstract class Car {
   public void run();

   public void stop();
}

// 具體實現類
class Benz implements Car {
   public void run() {
       System.out.println("Benz開始啓動了。。。。。");
   }

   public void stop() {
       System.out.println("Benz停車了。。。。。");
   }
}

class Ford implements Car {
   public void run() {
       System.out.println("Ford開始啓動了。。。");
   }

   public void stop() {
       System.out.println("Ford停車了。。。。");
   }
}

// 工廠類
class Factory {
   public static Car getCarInstance(String type) {
       Car c = null;
       if ("Benz".equals(type)) {
           c = new Benz();
       }
       if ("Ford".equals(type)) {
           c = new Ford();
       }
       return c;
   }
}

public class Test {

   public static void main(String[] args) {
       Car c = Factory.getCarInstance("Benz");
       if (c != null) {
           c.run();
           c.stop();
       } else {
           System.out.println("造不了這種汽車。。。");
       }

   }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章