簡單工廠,工廠方法,抽象工廠的區別

簡單工廠,是負責對象的建立,將對象的建立放在一個方法裏面  不少時候 就使用一個靜態的方法來建立對象,這樣能夠不用使用建立對象方法來實例化,直接使用類名來調用,可是這樣就不能經過繼承來改變工廠的創造行爲。    把對象抽出來創造的意義在於 工廠可能會被用的不少地方,如上面的例子不單單是手機店,還有可能使用的手機單據裏面.java

  看代碼 SampleFactory  裏面仍是要傳入 一個 手機品牌來具體的new ,可是若是手機品牌多了,那代碼將會被的很臃腫,因此這裏須要 使用反射加上配置文件來簡化。  設計模式

 工廠方法模式 : 聲明一個建立 對象的方法,而後由子類去決定要實例化那個,也就是將類的實例化推遲到子類。好比 手機專賣店 可能有小米專賣店,蘋果專賣店。 經過繼承的方式來有子類去決定 實例  化那個 小米專賣店就實例化 紅米,note,米4 等,蘋果專賣店就實例化 6,6plus,5s等  注意 依賴: 店鋪依賴 手機,具體的手機也須要 依賴手機 ,從而倒置這種依賴關係,高層組建和底層組建 依賴一樣的 東西!  ide

 

 抽象工廠模式 : 定義一個接口 用來建立相關和依賴的產品族,注意這裏是產品族,就是一類產品,好比下面代碼中 顯示屏 有 小米顯示屏,華爲顯示屏,蘋果顯示屏 抽象工廠模式的uml 圖:  spa

 

 具體要點: 全部的工廠都是封裝建立對象的設計

           

   簡單工廠並不能算是一個設計模式,可是它仍然將具體的實體類從應用程序中解耦。 code

  工廠方法 是經過繼承的方式 由子類去決定具體實例化那一個對象,將具體類的實例化推遲到子類中對象

 

抽象工廠方法: 經過工廠暴露出來的接口,來建立一類產品,也就是建立產品族。繼承

 

全部工廠都是爲了將對應的具體類 從應用程序中解耦,使程序設計 更加知足依賴抽象這一個原則。接口

 

 

代碼以下:get

package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public interface PhonePartsFactroy {
 public Batteries getBatteries();
 
 public Screen getScreen();
 
 public Recharger getRecharger();
 
} 
package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.IphoneBatteries;
import www.prodcut.com.IphoneRecharger;
import www.prodcut.com.IphoneScreen;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public class IPhonePartsFactroy  implements PhonePartsFactroy{
 @Override
 public Batteries getBatteries() {
  return new IphoneBatteries();
 }
 @Override
 public Screen getScreen() {
  return new IphoneScreen();
 }
 @Override
 public Recharger getRecharger() {
  return  new IphoneRecharger();
 }
}
package www.factory.com;
import www.prodcut.com.Batteries;
import www.prodcut.com.HuaWeiBatteries;
import www.prodcut.com.HuaWeiRecharger;
import www.prodcut.com.HuaWeiScreen;
import www.prodcut.com.Recharger;
import www.prodcut.com.Screen;
public class HuaweiPartsFactroy implements PhonePartsFactroy{
 @Override
 public Batteries getBatteries() {
  return new HuaWeiBatteries();
 }
 @Override
 public Screen getScreen() {
  return new HuaWeiScreen();
 }
 @Override
 public Recharger getRecharger() {
  return new HuaWeiRecharger();
 }
}
package www.prodcut.com;
public interface Batteries {
 public String  getBattersName();
}
package www.prodcut.com;
public interface Recharger {
 public String getRechargerName();
}

package www.prodcut.com;
public interface Screen {
 public String getScreenName();
}
package www.prodcut.com;
public class HuaWeiBatteries implements  Batteries{
 @Override
 public String getBattersName() {
   
    return "華爲原裝電池";
 }
}
package www.prodcut.com;
public class IphoneBatteries implements Batteries{
 @Override
 public String getBattersName() {
  return "蘋果原裝電池";
 }
}
package www.prodcut.com;
public class HuaWeiRecharger implements Recharger{
 @Override
 public String getRechargerName() {
  return "華爲手機充電器";
 }
}
package www.prodcut.com;
public class IphoneRecharger  implements Recharger{
 @Override
 public String getRechargerName() {
  return "蘋果手機充電器";
 }
}
package www.prodcut.com;
public class HuaWeiScreen implements Screen{
 @Override
 public String getScreenName() {
  return "華爲顯示屏";
 }
}
package www.prodcut.com;
public class IphoneScreen implements  Screen{
 @Override
 public String getScreenName() {
  
  return "蘋果顯示屏";
 }
}

package www.test.com;
import www.factory.com.HuaweiPartsFactroy;
import www.factory.com.IPhonePartsFactroy;
import www.factory.com.PhonePartsFactroy;
public class Test {
 
 public static void main(String[] args){
  PhonePartsFactroy phonePartsFactroy = new IPhonePartsFactroy();
  String name = phonePartsFactroy.getBatteries().getBattersName();
  System.out.println(name);
  
  
  PhonePartsFactroy huaweiPartsFactroy = new HuaweiPartsFactroy();
  String name1 = huaweiPartsFactroy.getBatteries().getBattersName();
  System.out.println(name1);
 }
 
}
相關文章
相關標籤/搜索