工廠模式

定義:

  1. 定義了一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類

目的:

  1. 定義一個用戶創建對象的接口,讓子類決定實例化哪一個類,工廠方法模式使一個類的實例化延遲到其子類

優勢:

  1. 在工廠方法模式中,工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節,用戶只需要關心所需產品對應的工廠,無須關心創建細節,甚至無須知道具體產品類的類名
  2. 基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱爲多態工廠模式,是因爲所有的具體工廠類都具有同一抽象父類。
  3. 使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了。這樣,系統的可擴展性也就變得非常好,完全符合“開閉原則”

劣勢:

  1. 在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。
  2. 由於考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。

結構:

工廠接口 聲明工廠方法,返回目標類
目標對象接口 定義產品接口
工廠實現類 實現工廠接口,針對不同的目標類不同的實現類,返回要求的目標類
目標對象實現類 工廠類具體的返回目標列

UML圖:

工廠接口:

package com.project.factory.methodfactory;
/**
 * 工廠接口
 * @author Administrator
 *
 */
public interface IFactory {
	/**
	 * 創建對象方法
	 * @return
	 */
	public ICar createCar();
}

產品接口:

package com.project.factory.methodfactory;

/**
 * 卡車接口
 * @author Administrator
 *
 */
public interface ICar {
	/**
	 * 卡車奔跑
	 */
	public void run();
}

工廠實現類:

package com.project.factory.methodfactory.impl;

import com.project.factory.methodfactory.ICar;
import com.project.factory.methodfactory.IFactory;

public class AodyFactory implements IFactory {
	/**
	 * 創建奧迪
	 */
	@Override
	public ICar createCar() {
		ICar car = new Aody();
		return car;
	}

}
package com.project.factory.methodfactory.impl;

import com.project.factory.methodfactory.ICar;
import com.project.factory.methodfactory.IFactory;

public class BydFactory implements IFactory {

	@Override
	public ICar createCar() {
		ICar car = new Byd();
		return car;
	}

}

產品實現類:

package com.project.factory.methodfactory.impl;

import com.project.factory.methodfactory.ICar;
/**
 * 比亞迪車
 * @author Administrator
 *
 */
public class Byd implements ICar {

	@Override
	public void run() {
		System.out.println("比亞迪跑");

	}

}
package com.project.factory.methodfactory.impl;

import com.project.factory.methodfactory.ICar;
/**
 * 奧迪車
 * @author Administrator
 *
 */
public class Aody implements ICar {

	@Override
	public void run() {
		System.out.println("奧迪跑");

	}

}

測試類:

package com.project.factory.methodfactory;

import com.project.factory.methodfactory.ICar;
import com.project.factory.methodfactory.impl.AodyFactory;
import com.project.factory.methodfactory.impl.BydFactory;

public class Client {
	public static void main(String[] args) {
		IFactory factoryByd = new BydFactory();
		ICar carByd = factoryByd.createCar();
		System.out.println(carByd);
		IFactory factoryAody = new AodyFactory();
		ICar carAody = factoryAody.createCar();
		System.out.println(carAody);
	}
}

參考:https://www.cnblogs.com/Bobby0322/p/4179921.html

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