public class SimplePhoneFactory {
public static Cellphone getCellphone(String type){
if("iPhone".equals(type)){
return new IPhone();
}else if("Samsung".equals(type)) {
return new Samsung();
}else {
throw new RuntimeException("沒有正確的手機類型創建");
}
}
}
/*
工廠方法接口
*/
public interface PhoneFactory {
public Cellphone getPhone();
}
/*
* @Description: iPhone 工廠
*/
public class IPhoneFactory implements PhoneFactory{
@Override
public Cellphone getPhone() {
// TODO Auto-generated method stub
return new IPhone();
}
}
/*
* @Description:samsung工廠
*/
public class SamsungPhoneFactory implements PhoneFactory{
@Override
public Cellphone getPhone() {
// TODO Auto-generated method stub
return new Samsung();
}
}
以上代碼可以看出,每個產品都需要自己的實現工廠,這時如果我們需要新增加新產品,比如小米手機,只需要新增一個MIPhoneFactory來實現PhoneFactory即可。
public interface CPU {
void run();
void start();
}
//高端CPU
class GoodCUP implements CPU{
@Override
public void run() {
System.out.println("高端CPU運轉方法。。。");
}
@Override
public void start() {
System.out.println("高端CPU開始方法。。。");
}
}
//低端CPU
class BadCPU implements CPU{
@Override
public void run() {
System.out.println("低端CPU運轉方法。。。");
}
@Override
public void start() {
System.out.println("低端CPU開始方法。。。");
}
}
然後是相機接口,以及相關的相機生產類型,其中的方法是隨便寫的。
public interface Camera {
public void take();
}
class GoodCamera implements Camera{
@Override
public void take() {
System.out.println("高端相機拍照。。。");
}
}
class BadCamera implements Camera{
@Override
public void take() {
System.out.println("低端相機拍照。。。");
}
}
最後一個內存的接口已經一系列類型:
public interface Memory {
void work();
}
class GoodMemory implements Memory{
@Override
public void work() {
System.out.println("高性能內存工作");
}
}
class BadMemory implements Memory{
@Override
public void work() {
System.out.println("低性能內存工作");
}
}
我們前面說了,抽象工廠就是利用一些列組件組合產品的工廠,上面我們寫的CPU,相機,內存都是我們要組件手機的組件。現在,我們開始寫我們的抽象工廠。當然為了方便,肯定要有工廠接口:
public interface AbPhoneFactory {
CPU getCPU();
Camera getCamera();
Memory getMemory();
}
然後,我們根據自己的需要,隨機組合幾種組件,即可得到我們的產品,當然這是一組(產品)組合出來的最終產品。
比如我們用好的CPU,好的內存,好的相機組合成一個好的手機:
public class GoodsPhoneFactory implements AbPhoneFactory{
@Override
public CPU getCPU() {
// TODO Auto-generated method stub
return new GoodCUP();
}
@Override
public Camera getCamera() {
// TODO Auto-generated method stub
return new GoodCamera();
}
@Override
public Memory getMemory() {
// TODO Auto-generated method stub
return new GoodMemory();
}
}
也可以用差的CPU,差的內存,差的相機組合成比較差勁的手機:
public class BadPhoneFactory implements AbPhoneFactory{
@Override
public CPU getCPU() {
// TODO Auto-generated method stub
return new BadCPU();
}
@Override
public Camera getCamera() {
// TODO Auto-generated method stub
return new BadCamera();
}
@Override
public Memory getMemory() {
// TODO Auto-generated method stub
return new BadMemory();
}
}
當然你也可以亂組合成中等的,這都是隨你便了,只要加一個工廠實現即可。
對於單一產品,簡單工廠更簡單,但是新增產品時卻很乏力,或者說不符合設計原則,而工廠方法是不修改原有類的前提下,新增工廠類實現,更符合設計原則。是不是我們在單一產品的時候就該選擇工廠方法了呢?下面給出這麼一個對比:
-- 結構復雜度 簡單工廠更加簡單 簡單工廠優於工廠方法
-- 代碼復雜度 工廠方法復雜度較高 簡單工廠優於工廠方法
-- 客戶端編程難度 工廠方法客戶端需要了解更多的實現工廠 簡單工廠優於工廠方法
-- 管理難度 工廠方法由於實現工廠類較多,管理更難 簡單工廠優於工廠方法
結合以上四點,我們說簡單工廠比工廠方法更加易用。這也就是開發時候簡單工廠比工廠方法使用的更多的原因。
對於產品族,如果使用工廠模式,唯一的選擇--抽象工廠。
OK,更多詳細代碼和本次測試代碼請參考github:https://github.com/LiuJishuai/designPatterns。