天天看點

GOF23設計模式之簡單工廠的實作

package com.bjsxt.cn.simplefactory;      
public interface Car {
 void run();
}      
package com.bjsxt.cn.simplefactory;      
public class Audi implements Car{      
 @Override
 public void run() {
  System.out.println("奧迪在跑");
  
 }      
}
      
package com.bjsxt.cn.simplefactory;      
public class Byd implements Car {      
 @Override
 public void run() {
  System.out.println("比亞迪在跑");
  
 }
 
}
      
package com.bjsxt.cn.simplefactory;      
public class Benchi implements Car {      
 @Override
 public void run() {
  System.out.println("奔馳在跑");      
 }      
}
      
package com.bjsxt.cn.simplefactory;
/*
 * 這是一種簡單工廠模式的實作。
 * 我作為調用者不需要知道具體的實作類,隻需要知道我所需要的車的類型是奧迪或者比亞迪就可以了。而不需要知道具體的建立這兩種車的
 * 具體手段(new Audi()或者new Byd()),這也就說明了調用者和建立的分離的核心思想
 * 
 * 倘若我們要增加一個新的類型,我們通過下面的手段可以實作這樣的目的:
 *  1, 增加新的實作Car接口的類,比如benchi類(奔馳車)
 *  2, 在CarFactory類中else部分增加類型判斷是否為奔馳,建立相應的車型車。
 *  3, 但是這樣做的後果就是已經違背了OCP原則,開閉原則,就是我們要不修改已有代碼的基礎上,擴充代碼(通過增加類實作)。但是
 *   顯然,我們需要修改CarFactory中的代碼語句。
 *  
 *  相對于不使用工廠模式的方法來說,整體來說類的結構變得複雜,但是對于調用者(client)來說,變得簡單了。
 *  簡單工廠模式也叫靜态工廠模式,就是工廠類一般是使用靜态方法,通過接收的參數的不同來傳回不同的對象執行個體。
 * */
public class CarFactory {
 public static Car createCar(String type) {
  if (type.equals("奧迪")) {
   return new Audi();
  } else if (type.equals("比亞迪")) {
   return new Byd();
  } else {
   
   return null;
  }
  
 }
}
      
/**
 * 時間:2015年3月29日10:05:41
 * 源程式作用:簡單工廠模式的另外一種實作方式
 * 
 * 這是簡單工廠模式工廠類的第二種實作方式
 * 通過在簡單工廠中建立相應每一個類的對應的建立方法來實作
 * 若要增加一種新的車輛類型,需要在包内建立相應的車輛類(這并沒有違反OCP,因為隻是增加了類,并沒有修改已有類)和在工廠類中增加相應的建立該車輛類型的方法。
 * 在工廠類中(CarFactory2)中增加新的建立相應類型的方法違背了開閉原則。
 * 
 * 簡單工廠模式又稱為靜态工廠模式就是因為在工廠類中具有很多的靜态方法,如該程式所示。
 */      
package com.bjsxt.cn.simplefactory;      
public class CarFactory2 {
 public static Car createAudi() {
  return new Audi();
 }
 
 public static Car createByd() {
  return new Byd();
 }
 
 public static Car CreateBenchi() {
  return new Benchi();
 }
}
      
/*
 * 時間:2015年3月29日10:00:02
 * 測試簡單工廠模式
 * 這是調用者Client。
 * 在本測試程式中,我們需要知道CarFactory,和你所要建立的車的類型。先要有一個工廠。
 * */
package com.bjsxt.cn.simplefactory;      
public class Client {
 public static void main(String[] args) {
  Car c1 = new CarFactory().createCar("奧迪");
  c1.run();
  
  new CarFactory().createCar("比亞迪").run();
 }
}

      

繼續閱讀