1. 程式人生 > >簡單工廠(Factory)模式

簡單工廠(Factory)模式

      舉兩個例子以快速明白Java中的簡單工廠模式:

 女媧摶土造人
話說:“天地開闢,未有人民,女媧摶土為人。”女媧需要用土造出一個個的人,但在女媧造出人之前,人的概念只存在於女媧的思想裡面。女媧造人,這就是簡單工廠模式的應用。

  首先,在這個造人的思想裡面,有幾個重要的角色:女媧本身、抽象的人的概念和女媧所造出的一個個具體的人。
  1.女媧是一個工廠類,也就是簡單工廠模式的核心角色。

        2.具休的一個個的人,包括張三,李四等。這些人便是簡單工廠模式裡面的具體產品角色

  3.抽象的人是最早只存在於女媧的頭腦裡的一個想法,女媧按照這個想法造出的一個個具體的人,便都符合這個抽象的人的定義。換言之,這個抽象的想法規定了所有具體的人必須都有的介面(抽象的想法



   其UML類圖出下所示:
    
理解了上面的這些東西,再來理解下面的例子,對照理解,相信看完這篇文章,便對java簡單工廠模式有一個很好的理解:


有一個農場公司,專門向市場銷售各類水果,在這個系統裡需要描述下列水果:
     葡萄 Grape
     草莓 Stuawberry
     蘋果 Apple
水果與其他植物不同,最終可以採摘食用,那麼一個自然的做法是建立一個各種水果都適用的介面,以便與其他農場裡的植物區分開來,


看了上面的2個例子,我們應該對簡單工廠模式有了簡單瞭解。下面我就寫一個類似例子1的小程式,體驗一下這個模式


1.寫一個介面(抽象的想法),程式碼如下所示;

package org.lxh.dao;
/**
 * @author chenwill3
 */
public interface Fruit {

	public abstract void eat();

}

2.下面寫幾個類(簡單工廠模式裡面的具體產品角色)來實現這個介面;

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Apple implements Fruit {

	public void eat() {
		System.out.println("**我在吃蘋果**");
	}

}

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Coconut implements Fruit {

	public void eat() {
		System.out.println("**我在吃椰子**");

	}

}

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Orange implements Fruit {

	public void eat() {
		System.out.println("**我在吃橘子**");

	}

}


3.寫一個工廠類(女媧),程式碼如下所示

package org.lxh.factory;

import org.lxh.dao.Fruit;
import org.lxh.impl.Apple;
import org.lxh.impl.Coconut;
import org.lxh.impl.Orange;

public class FruitFactory {
	public static Fruit getInstance(String type) {
		Fruit f = null;
		if ("apple".equals(type)) {
			f = new Apple();
		} else if ("orange".equals(type)) {
			f = new Orange();
		} else if ("coconut".equals(type)) {
			f = new Coconut();
		}
		return f;
	}
}



4.寫一個測試類檢視效果。

package test;

import org.lxh.dao.Fruit;
import org.lxh.factory.FruitFactory;

public class Test {

	/**
	 * @author chenwill3
	 */
	public static void main(String[] args) {
		Fruit f=null;
        f=FruitFactory.getInstance("apple");
        
        if(f!=null)
        {
        	f.eat();
        }
	}

}

   下面看一下執行效果圖;




   這次還是一樣,原始碼也提供下載。有問題的給我寫評論。