設計模式——抽象工廠模式

定義:java

 抽象工廠模式提供一個接口,用於建立相關或者依賴對象的家族,而不須要明確指定具體類。ide

 抽象工廠容許客戶端使用抽象的接口來建立一組相關的產品,而不須要關係實際產出的具體產品是什麼。這樣一來,客戶就能夠從具體的產品中被解耦。ui

 

示例代碼:設計

Fruit.java對象

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public interface Fruit {

	/***
	 * 定義吃水果的方法
	 */
	public void eatFruit();

}

  

Apple.javablog

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public abstract class Apple implements Fruit {

	public abstract void eatFruit();
}

 

Banana.java接口

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public abstract class Banana implements Fruit {

	public abstract void eatFruit();
}

  

NorthApple.javaget

package com.designPattern.abstractFactory;

public class NorthApple extends Apple {

	@Override
	public void eatFruit() {
		
		System.out.println("吃北方蘋果。。。。。。");

	}

}

 

NorthBanana.java產品

package com.designPattern.abstractFactory;

public class NorthBanana extends Banana {

	@Override
	public void eatFruit() {

		System.out.println("吃北方香蕉。。。。。。");

	}

}

 

SouthApple.javait

package com.designPattern.abstractFactory;

public class SouthApple extends Apple {

	@Override
	public void eatFruit() {

		System.out.println("吃南方蘋果。。。。。。");

	}

}

 

SouthBanana.java

package com.designPattern.abstractFactory;

public class SouthBanana extends Banana {

	@Override
	public void eatFruit() {

		System.out.println("吃南方香蕉。。。。。。");

	}

}

  

FruitFactory.java

package com.designPattern.abstractFactory;

public abstract class FruitFactory {

	/***
	 * 採集水果
	 * 
	 * @param type
	 * @return
	 */
	public abstract Fruit getFruit(String type);

}

  

NorthFruitFactory.java

package com.designPattern.abstractFactory;

public class NorthFruitFactory extends FruitFactory {

	@Override
	public Fruit getFruit(String type) {

		if ("Apple".equals(type)) {

			return new NorthApple();

		} else if ("Banana".equals(type)) {

			return new NorthBanana();

		} else {

			System.out.println("找不到對應的水果......");

			return null;
		}

	}

}

  

SouthFruitFactory.java

package com.designPattern.abstractFactory;

public class SouthFruitFactory extends FruitFactory {

	@Override
	public Fruit getFruit(String type) {

		if ("Apple".equals(type)) {

			return new SouthApple();

		} else if ("Banana".equals(type)) {

			return new SouthBanana();

		} else {

			System.out.println("找不到對應的水果......");

			return null;
		}

	}

}

  

MainTest.java

package com.designPattern.abstractFactory;

public class MainTest {

	public static void main(String[] args) {

		// 北方水果
		NorthFruitFactory northFruitFactory = new NorthFruitFactory();

		Fruit northApple = northFruitFactory.getFruit("Apple");

		northApple.eatFruit();

		Fruit northBanana = northFruitFactory.getFruit("Banana");

		northBanana.eatFruit();

		// 南方水果
		SouthFruitFactory southFruitFactory = new SouthFruitFactory();

		Fruit southApple = southFruitFactory.getFruit("Apple");

		southApple.eatFruit();

		Fruit southBanana = southFruitFactory.getFruit("Banana");

		southBanana.eatFruit();

	}

}

  

優勢

           一、  抽象工廠隔離了具體類的生成,是的客戶端不須要知道什麼被建立。全部的具體工廠都實現了抽象工廠中定義的公共接口,所以只須要改變具體工廠的實例,就能夠在某種程度上改變整個軟件系統的行爲。

           二、  當一個產品族中的多個對象被設計成一塊兒工做時,它可以保證客戶端始終只使用同一個產品族中的對象。

 缺點

           添加新的行爲時比較麻煩。若是須要添加一個新產品族對象時,須要更改接口及其下全部子類,這必然會帶來很大的麻煩。

相關文章
相關標籤/搜索