1. 程式人生 > >模式的秘密之工廠模式

模式的秘密之工廠模式

key draw exceptio 抽象工廠 ide 實例 java block 擴展

工廠模式概念:實例化對象,用工廠模式代替new操作

工廠模式包括工廠方法模式和抽象工廠模式

       抽象工廠模式是工廠方法模式的擴展

工廠模式的意圖:定義一個接口來創建對象,但讓子類決定哪些類需要被實例化。

        工廠方法把實例化的工作推遲到子類中去實現。

工廠方法模式類圖

技術分享圖片

package com.fyf;
/**
 * 發型接口
 * @author 18401
 *
 */
public interface HairInterface {
	
	//實現了發型
	public void draw();
}

  

package com.fyf;

/**
 * 發型工廠
 * @author 18401
 *
 */
public class HairFactory {
	/**
	 * 根據類型來創建對象
	 */
	public HairInterface getHair(String key){
		if("left".equals(key)){
			return new LetfHair();
		}else if("right".equals(key)){
			return new RightHair();
		}
		return null;
	}
	public HairInterface getHairByClass(String className){
		try {
			HairInterface hair = (HairInterface) Class.forName(className).newInstance();
			return hair;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

  

package com.fyf;
/**
 * 左偏分發型
 * @author 18401
 *
 */
public class LetfHair implements HairInterface {
	/**
	 * 畫了一個左偏分
	 */
	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("----左偏分發型-----");
	}

}

  

package com.fyf;
/**
 * 右偏分發型
 * @author 18401
 *
 */
public class RightHair implements HairInterface {
	/**
	 * 畫了一個右偏分
	 */
	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("----右偏分發型-----");
	}

}

  

package com.fyf;

public class Test {
	//客戶端
	public static void main(String[] args) {
		
//		HairInterface left = new LetfHair();
//		left.draw();
		HairFactory factory = new HairFactory();
//		HairInterface left = factory.getHair("left");
//		left.draw();
		HairInterface left = factory.getHairByClass("com.fyf.LetfHair");
		left.draw();
	}
}	

  

模式的秘密之工廠模式