工廠模式:使用者不用建立使用對象,直接從工廠取出對象進行使用。java
示例:子宮(工廠)創造各類動物ide
工廠模式的優點:在添加動物的時候不須要修改客戶端(TestFactoryPattern),只須要直接添加動物就能夠,工廠會自動(這時須要一個標示告訴工廠你須要那種動物,也就是type)返回須要的動物。測試
工廠模式類圖:優化
直接代碼:this
定義一個抽象類Animal,定義動物的共同屬性 name,speed,共同行爲:say(),run();,子類可進行覆寫方法實現本身特有的行爲。spa
package com.zpj.designMode; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:11:07 * @version :1.1 * */ public abstract class Animal { public String name; public int speed; public abstract void run(); public abstract void say(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } }
下面添加三個動物:Person Tiger ,Pandacode
package com.zpj.designMode; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:13:48 * @version :1.1 * */ public class Person extends Animal { public Person() { } public Person(String name, int speed) { this.name = name; this.speed = speed; } @Override public void run() { System.out.println(name + "--兩條腿跑---speed:" + speed + "KM/h"); } @Override public void say() { System.out.println(name + "--嘴說--- hello , i am " + name); } }
package com.zpj.designMode; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:18:45 * @version :1.1 * */ public class Tiger extends Animal { public Tiger() { super(); // TODO Auto-generated constructor stub } public Tiger(String name, int speed) { super(); this.name = name; this.speed = speed; } public void run() { System.out.println(name + "--四條腿竄---speed:" + speed); } public void say() { System.out.println(name + "--吼--- hello , i am " + name); } }
package com.zpj.designMode; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:17:45 * @version :1.1 * */ public class Panda extends Animal{ public Panda() { super(); // TODO Auto-generated constructor stub } public Panda(String name,int speed) { this.name = name; this.speed = speed; } public void run() { System.out.println(name + "--四條腿爬---speed:" + speed); } public void say() { System.out.println(name + "--不知道--- hello , i am " + name); } }
建立個子宮(工廠)生產動物對象
package com.zpj.designMode; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.util.Properties; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:21:38 * @version :1.1 * */ public class Uterus { public static Animal createAnimal(int type) {//type 類型告訴工廠客戶端須要什麼動物 switch (type) { case 1: return new Person("所謂的高級動物", 30); case 2: return new Tiger("老虎", 100); case 3: return new Panda("黑白貓", 10); } return null; } public static Animal createAnimal() throws Exception { //從配置文件中讀出客戶端須要什麼動物 Properties prop = new Properties(); InputStream in = Object.class.getResourceAsStream("/com/zpj/designMode/animal.properties"); try { prop.load(in); String type = prop.getProperty("type").trim(); String name = prop.getProperty("name").trim(); String speed = prop.getProperty("speed").trim(); //使用反射機制生成客戶端須要的動物 Class classs = Class.forName(type); Animal animal = (Animal) classs.newInstance(); animal.setName(name); animal.setSpeed(Integer.parseInt(speed)); return animal; } catch (IOException e) { e.printStackTrace(); } return null; } }
測試類:blog
package com.zpj.designMode; import org.junit.Test; /** * @author PerKins Zhu * @date:2016年8月27日 下午5:39:35 * @version :1.1 * */ public class TestFactoryPattern { @Test public void test01() throws Exception { Animal animal; for (int i = 1; i < 4; i++) { System.out.println("-----------------test:" + i + " -------------------"); animal = Uterus.createAnimal(i); animal.say(); animal.run(); } } //使用配置文件告訴工廠須要什麼動物 @Test public void test02() throws Exception { Animal animal; animal = Uterus.createAnimal(); animal.say(); animal.run(); } }
說明一下:get
test01()是普通的工廠模式,這裏有一個缺陷,就是在增長動物的時候須要更改工廠,在 public static Animal createAnimal(int type)方法中須要添加一種新類型。
test02()是優化後的測試方法,此時調用public static Animal createAnimal() throws Exception (),從配置文件中讀取客戶端須要的對象,此時若是須要添加動物,只須要修改配置問價就能夠了,不須要再對
createAnimal()方法進行修改。
配置文件內容:
type=com.zpj.designMode.Person
name=所謂的高級動物
speed=30
注意:
注意讀取配置文件的路徑問題
反射機制使用的時候類中必須有空的構造方法。