創建型設計模式

創建型設計模式:

對類的實例化過程進行抽象,能夠使軟件模塊做到與對象的創建和組織無關,創建型模式隱藏了對象的創建細節,通過隱藏對象如何被創建和組合在一起達到能夠使整個系統獨立的目的。

設計模式 定義
簡單工廠模式(Simple Factory) 定義一個類,根據參數的不同返回不同類的實例,這些類具有共有的父類和一些公共的方法
簡單工廠模式不屬於GOF設計模式,是最簡單的工廠模式
工廠方法模式(Factory Method
Pattern)
定義一個用於創建對象的接口,讓子類決定哪一個類實例化
抽象工廠模式(Abstract Factory Pattern) 提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類
建造者模式(Builder Pattern) 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
原型模式(Prototype) 用原型實例化指定創建對象的種類,並且通過拷貝這個原型來創建新的對象
單例模式(SingletonPattern) 保證一個類僅有一個實例,並且提供一個訪問它的全局訪問點

簡單工廠:

又稱爲靜態工廠方法模式(Static Factory Method Pattern)屬於創建型模式,簡單工廠可以根據參數的不同返回不同類的實例。

Factory表示工廠類,是整個模式的核心,負責實現創建所有實例的內部邏輯,工廠類可以被外界直接調用,創建所需的產品
product表示抽象產品
concreteProduct是具體產品
簡單工廠模式圖:
ShapeFactory 充當工廠類
Shape充當抽象產品
具體產品:Circle,Rectangle,Triangle
抽象產品:形狀接口Shape
工廠類:
package Factory;

import AbstractProduct.Shape;
import ConcreteProduct.Circle;
import ConcreteProduct.Rectangle;
import ConcreteProduct.Triangle;
import Error.UnsupportShapeException;

public class ShapeFactory {
	//靜態工廠方法
	public static Shape createShape(String type)throws UnsupportShapeException{
		if(type.equalsIgnoreCase("c")){
			return new Circle();
		}
		else if(type.equalsIgnoreCase("r")){
			return new Rectangle();
		}
		else if(type.equalsIgnoreCase("t")){
			return new Triangle();
		}
		else{
			throw new UnsupportShapeException("不支持該形狀");	
		}
	}
}
抽象產品類:Shape
package AbstractProduct;

public interface Shape {
	public void draw();
	public void erase();

}
具體產品類:
Circle
package ConcreteProduct;

import AbstractProduct.Shape;

public class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("繪製圓形");
	}

	@Override
	public void erase() {
		System.out.println("擦除圓形");
	}

}
Rectangle
package ConcreteProduct;

import AbstractProduct.Shape;

public class Rectangle implements Shape {

	@Override
	public void draw() {
		System.out.println("繪製矩形");
	}

	@Override
	public void erase() {
		System.out.println("擦除矩形");
	}

}
Triabgle
package ConcreteProduct;

import AbstractProduct.Shape;

public class Triangle implements Shape {

	@Override
	public void draw() {
		System.out.println("繪製三角形");
	}

	@Override
	public void erase() {
		System.out.println("擦除三角形");
	}
}
測試類:
package Test;

import AbstractProduct.Shape;
import Error.UnsupportShapeException;
import Factory.ShapeFactory;

public class Test {
	public static void main(String args[]){
		
		try {
			Shape shape;
			shape=ShapeFactory.createShape("t");
			shape.draw();
		        shape.erase();
		} catch (UnsupportShapeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
異常類:
package Error;

public class UnsupportShapeException extends Exception{
	public UnsupportShapeException (String message){
		super(message);
	}

}

測試結果:


缺點:工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響;同時系統的擴展也比較困難,一旦添加新產品就不得不修改工廠邏輯,違反了開閉原則,並且造成工廠邏輯過於複雜。


工廠方法模式:

又稱虛擬構造器模式或者多態模式
Product 表示抽象產品,它定義了產品的接口
ConcreteProduct表示具體產品,它實現了抽象產品的接口
Factory表示抽象工廠,它聲明工廠方法(Factory Method),返回一個產品
ConcreteFactory表示具體工廠,它實現工廠方法,由客戶端調用。返回一個產品的實例


工廠方法模式實例之日誌記錄器

抽象產品
package Product;

public interface Log {
	public void writeLog();
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">具體產品:文件日誌</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">package ConcreteProduct;

import Product.Log;

public class FileLog implements Log{

	@Override
	public void writeLog() {
		System.out.println("文件日誌記錄");
	}

}
具體產品:數據庫日誌
package ConcreteProduct;

import Product.Log;

public class DatabaseLog implements Log{

	@Override
	public void writeLog() {
		System.out.println("數據庫日誌記錄");	
	}
}




日誌記錄器工廠接口:抽象工廠
package Factory;

import Product.Log;

public interface LogFactory {
    public Log createLog();
}
具體工廠:文件日誌工廠類
package ConcreteFactory;

import ConcreteProduct.FileLog;
import Factory.LogFactory;
import Product.Log;

public class FileLogFactory implements LogFactory {

	public Log createLog() {
		return new FileLog();
	}
}
具體工廠:數據庫日誌工廠類
package ConcreteFactory;

import ConcreteProduct.DatabaseLog;
import Factory.LogFactory;
import Product.Log;

public class DatabaseLogFactory implements LogFactory {

	public Log createLog() {
		return new DatabaseLog();
	}
}

客戶端測試類
package Test;

import ConcreteFactory.FileLogFactory;
import ConcreteProduct.FileLog;
import Factory.LogFactory;
import Product.Log;

public class test {
	public static void main(String args[]){
		LogFactory factory;
		Log log;
		factory=new FileLogFactory();
		log=new FileLog();
		log.writeLog();
	}
}
運行結果:


優點:系統添加新的產品時只需要編寫新的具體工廠和具體產品




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