設計模式—簡單工廠

工廠模式:使用者不用建立使用對象,直接從工廠取出對象進行使用。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

注意:

  注意讀取配置文件的路徑問題

  反射機制使用的時候類中必須有空的構造方法。

相關文章
相關標籤/搜索