1. 程式人生 > >工廠模式之方法工廠

工廠模式之方法工廠

1 簡單工廠缺點 以及方法工廠實現邏輯

通過我的上一篇部落格 工廠模式之簡單工廠 我們瞭解了什麼是簡單工廠。我們可以通過建立鋼工廠類物件來獲取不同型別的鋼物件。但是如果我們每次新增加一種型別的鋼,我們需要對鋼工廠類的getSteel 方法進行修改。這顯然是違反了設計模式的開放閉合原則。而我們的方法工廠剛好彌補了簡單工廠的這個缺點。
那我們方法工廠是怎麼做的呢? 首先我們先提供工廠的抽象,也就是工廠生產的標準。然後將原來的一個工廠根據鋼的種類拆分成各自的工廠,同時實現工廠的抽象,也可以理解成符合工廠的生產標準。獲取鋼物件由原來的一個工廠中獲取 變成通過不同種類的工廠來獲取。

2 方法工廠程式碼實現

1 定義工廠的抽象 也是定義工廠的生產規範
getSteel 方法就是生產鋼的規範。

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public interface Factory {
	public Steel getSteel();
}

2 為每種型別的鋼建立各自的工廠類。

生產鑄鋼的工廠類

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.CastSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public class CastSteelFactory implements Factory{

	@Override
	public Steel getSteel() {
		return new CastSteel();
	}

}

生產冷拉鋼 的工廠類

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.ColdDrawnSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public class ColdDrawnSteelFactory implements Factory {

	@Override
	public Steel getSteel() {
		return new ColdDrawnSteel();
	}

}

生產鍛鋼的工廠類

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.ForgedSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public class ForgedSteelFactory implements Factory{

	@Override
	public Steel getSteel() {
		return new ForgedSteel();
	}
	
}

生產熱軋鋼的工廠類

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.HotRolledSteel;
import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public class HotRolledSteelFactory implements Factory{

	@Override
	public Steel getSteel() {
		return new HotRolledSteel();
	}
}

方法工廠模式的測試類

package cn.zhuoqianmingyue.examples.factorypattern.method;

import cn.zhuoqianmingyue.examples.factorypattern.simple.Steel;

public class ApplicationTest {
	
	public static void main(String[] args) {
		//生產鑄鋼
		Factory castSteelFactory = new CastSteelFactory();
		Steel castSteel = castSteelFactory.getSteel();
		log(castSteel.getName());
		//生產冷拉鋼
		Factory  coldDrawnSteelFactory = new ColdDrawnSteelFactory();
		Steel coldDrawnSteel = coldDrawnSteelFactory.getSteel();
		log(coldDrawnSteel.getName());
	}
	private static void log(String name) {
		System.out.println("生產"+name+"成功!");
	}
}

測試結果:
在這裡插入圖片描述