設計模式 --工廠模式

工廠模式屬於建立型模式,它提供了一種建立對象的最佳方式。
設計意圖:有一個接口,它有多個子類,此時定義一個工廠類,該類用於管理子類的建立。
什麼時候使用:不一樣的條件須要建立不一樣的實例。
應用場景:
1>日誌記錄器:日誌能夠保存到本地硬盤、系統事件與遠程服務器等,用戶能夠選擇日誌存放到什麼地方。即用戶不一樣的想法須要建立不一樣的實例(硬盤、系統事件、遠程服務器等)。
2>數據庫訪問:數據庫的種類有多種,用戶根據不一樣的須要選擇不一樣的數據庫0。
3>鏈接服務器的協議:用戶選擇不一樣的協議鏈接不一樣的服務器。java

實現
1.建立一個shape接口數據庫

public interface Shape {
	
	void draw();
}

2.建立接口的實現類
//Circle.java服務器

public class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("Circle");	
	}

}

//Rectangle.javaide

public class Rectangle implements Shape {

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

}

3.建立一個工廠類,用於管理接口子類
//ShapeFactory.java測試

public class ShapeFactory {
	
	public Shape getShape(String shapeType){
		
		if (shapeType == null) {
			return null;
		}
		
        //根據不一樣的條件,建立不一樣的實例
		if (shapeType.equals("circle")) {
			return new Circle();
		}else if (shapeType.equals("rectangle")) {
			return new Rectangle();
		}
		
		return null;
	}

}

4.使用
//FactoryDemo設計

public class FactoryDemo {
	
	public static void main(String[] args) {
		
		/**
		 * 不使用工廠模式
		 * 假設建立子實例是一個很繁瑣的過程
        * 則每次要使用一個新實例的時候,都須要作建立新實例重複的過程
		 */
		Shape shapeN1 = new Circle();
		shapeN1.draw();
		
		Shape shapeN2 = new Rectangle();
		shapeN2.draw();
		
		
		/**
		 * 使用工廠模式
		 * 建立一個工廠類,完成 建立子類對象的一些繁瑣的過程
		 * 用戶只須要知道須要建立一個什麼名稱的新對象便可
		 * 這樣能夠隱藏對象的建立過程
		 */
		
		//建立工廠類對象
		ShapeFactory shapeFactory = new ShapeFactory();
		
		//獲取circle對象,調用它的方法
		Shape shape1 = shapeFactory.getShape("circle");
		shape1.draw();
		
		//獲取rectangle對象,調用它的方法
		Shape shape2 = shapeFactory.getShape("rectangle");
		shape2.draw();
	}

}

5.輸出結果日誌

Circle
Rectangle

6.如上的工廠模式(模式1)能夠改進 在模式1中,若是用戶須要新增一個形狀類(如Square.java),則用戶須要修改工廠類和新增Square類。 以下模式2,能夠改善模式1 修改工廠類以下code

public class ShapeFactory {

	public static Shape getShapeInstance(String shapeType) {

		if (shapeType == null) {
			return null;
		}

		Shape shape = null;
		try {
			// 利用反射獲得圖形類型
			shape = (Shape) Class.forName("com.readygo.test." + shapeType).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO: handle exception
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return shape;
	}

}

則對應的測試爲對象

public class FactoryDemo {
	
	public static void main(String[] args) {
		
		/**
		 * 對比模式1與模式2
		 * 模式1:咱們建立的形狀實例必須是工廠類中定義了的,
		 * 若是咱們須要建立一個新的形狀實例,則須要修改工廠類,同時增長這個新的實例
		 * 
		 * 模式2:利用反射機制獲得形狀類型,
		 * 當咱們須要增長一種新的形狀時,不須要修改工廠類,只須要增長要實現的類便可
		 * 從而達到了工廠分離的效果
		 */
		Shape shape = ShapeFactory.getShapeInstance("Rectangle");
		if (shape != null) {
			shape.draw();
		}else
		{
			System.out.println("不存在這種對象");
		}
	}

}
相關文章
相關標籤/搜索