Java設計模式 -- 簡單工廠模式(SimpleFactory)

1、什麼是簡單工廠模式

      簡單工廠模式屬於類的建立型模式,又叫作靜態工廠方法模式。經過專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。java

2、模式中包含的角色及其職責

1.工廠(Creator)角色 簡單工廠模式的核心,它負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所需的產品對象。
2.抽象(Product)角色 簡單工廠模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。
3.具體產品(Concrete Product)角色 簡單工廠模式所建立的具體實例對象app

3、具體實例

如今有兩個類,分別是Apple和Banana,都有一個Get方法:優化

Apple.javaui

package cc.dewdrop;

public class Apple{
	public void get(){
		System.out.println("採集蘋果");
	}
}

 Banana.java對象

package cc.dewdrop;

public class Banana{
	public void get(){
		System.out.println("採集香蕉");
	}
}

 在主方法中實例化並分別調用個體方法:blog

package cc.dewdrop;

public class SimpleFactory {

	public static void main(String[] args) {
		Apple apple = new Apple();
		Banana banana = new Banana();
		apple.get();
		banana.get();
    }
}

 發現兩個類都有一個共同的get方法,那麼咱們就能夠抽象出一個接口,而後Apple和Banana兩個類分別實現這個接口:接口

Fruit.javaget

package cc.dewdrop;

public interface Fruit {
	public void get();
}

 Apple.java產品

package cc.dewdrop;

public class Apple implements Fruit{
	public void get(){
		System.out.println("採集蘋果");
	}
}

 Banana.javait

package cc.dewdrop;

public class Banana implements Fruit{
	public void get(){
		System.out.println("採集香蕉");
	}
}

 在主方法中就可使用下面這種方式來建立對象:

public class SimpleFactory {

	public static void main(String[] args) {
		 Fruit apple = new Apple();
		 Fruit banana = new Banana();
		 apple.get();
		 banana.get();
    }
}

 根據簡單工廠模式的特色,如今就須要建立一個類來建立類的對象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
	 /**
	 * 得到Apple實例
	 */
	 public Fruit getApple() {
	 return new Apple();
	 }
	
	 /**
	 * 得到Banana實例
	 */
	 public Fruit getBanana() {
	 return new Banana();
	 }
}

 在主方法中就可使用以下方式進行調用:

public class SimpleFactory {

	public static void main(String[] args) {
		Fruit apple = new FruitFactory().getApple();
		Fruit banana = new FruitFactory().getBanana();
		apple.get();
		banana.get();
    }
}

 再進一步,咱們能夠修改工廠類,使用靜態方法來建立對象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
	 /**
	 * 得到Apple實例
	 */
	 public static Fruit getApple() {
	 return new Apple();
	 }
	
	 /**
	 * 得到Banana實例
	 */
	 public static Fruit getBanana() {
	 return new Banana();
	 }
}

 在主方法中就能夠直接使用類名來調用:

public class SimpleFactory {

	public static void main(String[] args) {
		Fruit apple = FruitFactory.getApple();
		Fruit banana = FruitFactory.getBanana();
		apple.get();
		banana.get();
    }
}

 進一步改進工廠類,但願有一個公用的方法來建立全部產品的對象:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {
		if (type.equalsIgnoreCase("apple")) {
			return Apple.class.newInstance();
		} else if (type.equalsIgnoreCase("banana")) {
			return Banana.class.newInstance();
		} else {
			System.out.println("class not found");
		}
		return null;
	}
}

 在主方法中使用以下方式調用:

public class SimpleFactory {

	public static void main(String[] args) {
		Fruit apple = FruitFactory.getFruit("apple");
		Fruit banana = FruitFactory.getFruit("banana");
		apple.get();
		banana.get();
    }
}

 這樣調用工廠類建立對象的操做就簡化了不少,可是還有一個缺點,就是若是在新增長一個類是,就必須修改工廠類。那麼此時工廠類能夠作出以下修改:

FruitFactory.java

package cc.dewdrop;

public class FruitFactory {
	public static Fruit getFruit(String type)
			throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		return (Fruit) Class.forName(type).newInstance();
	}
}

 須要注意一點的是,在調用的時候須要使用類的完整路徑(包括包名):

public class SimpleFactory {

	public static void main(String[] args) {
		Fruit apple = FruitFactory.getFruit("cc.dewdrop.Apple");
		Fruit banana = FruitFactory.getFruit("cc.dewdrop.Banana");
		apple.get();
		banana.get();
    }
}

 4、簡單工廠模式的優缺點

      在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,可以根據外界給定的信息,決定究竟應該建立哪一個具體類的對象。用戶在使用時能夠直接根據工廠類去建立所需的實例,而無需瞭解這些對象是如何建立以及如何組織的。有利於整個軟件體系結構的優化      不難發現,簡單工廠模式的缺點也正體如今其工廠類上,因爲工廠類集中了全部實例的建立邏輯,因此「高內聚」方面作的並很差。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要作相應的修改,擴展性並不很好。

相關文章
相關標籤/搜索