創建型設計模式:
對類的實例化過程進行抽象,能夠使軟件模塊做到與對象的創建和組織無關,創建型模式隱藏了對象的創建細節,通過隱藏對象如何被創建和組合在一起達到能夠使整個系統獨立的目的。
設計模式 | 定義 |
簡單工廠模式(Simple Factory) | 定義一個類,根據參數的不同返回不同類的實例,這些類具有共有的父類和一些公共的方法 簡單工廠模式不屬於GOF設計模式,是最簡單的工廠模式 |
工廠方法模式(Factory Method Pattern) |
定義一個用於創建對象的接口,讓子類決定哪一個類實例化 |
抽象工廠模式(Abstract Factory Pattern) | 提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類 |
建造者模式(Builder Pattern) | 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 |
原型模式(Prototype) | 用原型實例化指定創建對象的種類,並且通過拷貝這個原型來創建新的對象 |
單例模式(SingletonPattern) | 保證一個類僅有一個實例,並且提供一個訪問它的全局訪問點 |
簡單工廠:
簡單工廠模式圖:
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("不支持該形狀");
}
}
}
抽象產品類:Shapepackage 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("擦除圓形");
}
}
Rectanglepackage ConcreteProduct;
import AbstractProduct.Shape;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("繪製矩形");
}
@Override
public void erase() {
System.out.println("擦除矩形");
}
}
Triabglepackage 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);
}
}
測試結果:
工廠方法模式:
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();
}
}
運行結果: