設計模式隨筆一

六個原則(Solid)

Single Responsibility Principle:單一職責原則--接口職責單一,類的設計儘量只有一個原因引起變化。

Open Closed Principle:開閉原則--一個軟件實體如類(抽象)、模塊、方法應該對擴展開放,對修改關閉。

Liskov Substitution Principle:里氏替換原則--父類能出現的地方,子類就可以替換父類。

Law of Demeter:迪米特法則--一個對象應該對其他對象有最少的瞭解(合理的公開public方法,儘量最少)。

Interface Segregation Principle:接口隔離原則--建立單一接口,不要建立臃腫龐大的接口(爲模塊提供單一接口)。

Dependence Inversion Principle:依賴倒置原則--面向接口(抽象類)編程。


設計模式

1.單例模式

確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。

public final  class Singleton {

	private static final Singleton INSTANCE = new Singleton();
	
	private Singleton(){}
	
	public static Singleton getInstance() {
		return INSTANCE;
	}
	
	public static void otherMethod(){
		
	}
}
//多線程版本<pre class="java" name="code">public static Singleton getInstance(){      
    if (instance == null)      
        synchronized(instance){      
            if(instance == null)      
                instance = new Singleton();      
        }      
    return instance;       
}
//按需加載
public class Singleton{      
    private Singleton(){      
        …      
    }      
    private static class SingletonContainer{      
        private static Singleton instance = new Singleton();      
    }      
    public static Singleton getInstance(){      
        return SingletonContainer.instance;      
    }      
}


Note:在併發編程中,需要考慮同步處理。

2.工廠方法模式

定義一個用於創建對象的接口,讓子類決定實例化哪一個類。

在工廠方法模式中,抽象產品類Product負責定義產品的共性,實現對事物最抽象的定義。產品就是對象,就是要創建的對象。

一個通用的例子

	// 抽象產品:對象
	public abstract class Product {
		// 公共方法
		public void pubMethod() {
			// 具體邏輯實現
		}

		// 抽象方法
		public abstract void absMethod();
	}

	// 具體產品
	public class ConcreteProduct extends Product {
		private ConcreteProduct(){}
		@Override
		public void absMethod() {
			// 具體實現
		}
	}

	// 抽象工廠
	public abstract class Factory {
		// 創建產品,更加參數創建
		public abstract <T extends Product> T create(Class<T> clazz);
	}

	// 具體工廠
	public class ConcreteFactory extends Factory {
		@SuppressWarnings("unchecked")
		@Override
		public <T extends Product> T create(Class<T> clazz) {
			try {
				Product product = null;
				product = (Product) Class.forName(clazz.getName())
						.newInstance();
				return (T) product;
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}

	}

	public static void main(String[] args) {
		Factory fac = new ConcreteFactory();
		Product pro = fac.create(ConcreteProduct.class);
	}
在單一場景中,修改爲簡單工廠模式

// 簡單工廠
	public class SimpleFactory  { 
		@SuppressWarnings("unchecked")
		public <T extends Product> T create(Class<T> clazz) {
			try {
				Product product = null;
				product = (Product) Class.forName(clazz.getName())
						.newInstance();
				return (T) product;
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
	}
延遲初始化中應用工廠模式

public final class MapFactory {
	private static final Map<String, Product> map = new HashMap<>();

	public static synchronized Product create(String name) {
		Product p = null;
		if (map.containsKey(name)) {
			p = map.get(name);
		} else {
			p = new ConcreteProduct();
			map.put(name, p);
		}
		return p;
	}
}




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