簡單工廠的構成包括三個角色:
1)抽象產品類
2)具體產品類(繼承抽閑產品類)
3)工廠類(生產具體產品)
具體代碼實現
1、抽象產品類
/**
* 抽象類
*/
public abstract class Car {
/**
* 產品抽象方法,將會由具體產品類實現
*/
public abstract void driving();
}
2、具體產品類
/**
* 具體產品類BenZCar
*/
public class BenZCar extends Car {
@Override
public void driving() {
System.out.println("BenZCar is Driving!!!");
}
}
/**
* 具體產品類BMWCar
*/
public class BMWCar extends Car {
@Override
public void driving() {
System.out.println("BMWCar is Driving!!!");
}
}
3、工廠類
/**
* 簡單工廠類
*/
public class CarFactory {
public static Car create(String type) {
Car car = null;
switch (type) {
case "bmw":
car = new BMWCar();
break;
case "benz":
car = new BenZCar();
break;
}
return car;
}
}
4、調用(這里使用AndroidStudio代碼測試,如果是java的可以在main函數中測試)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.id_bmw).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CarFactory.create("bmw").driving();
}
});
findViewById(R.id.id_benz).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CarFactory.create("benz").driving();
}
});
}
}
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/id_bmw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="制造一個BWM汽車"
android:layout_marginBottom="15dp"/>
android:id="@+id/id_benz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="制造一個Benz汽車"
android:layout_marginBottom="15dp"/>
5、界面
6、測試結果
08-20 10:59:55.001 3660-3660/com.tech.aile.designpatterns I/System.out: BMWCar is Driving!!!
08-20 10:59:56.573 3660-3660/com.tech.aile.designpatterns I/System.out: BenZCar is Driving!!!
7、使用場景
1)工廠類創建的具體對象要較少,不適用子類過多,子類層級過深的場景。
2)看客戶只需要傳入什么類型的參數,不用關注創建對象的邏輯。
8、優點
根據參數類型獲取實例,不用關注具體細節,降低了耦合
9、缺點
具體的產品類型在編譯期間已經確定,不能更改,如果需要新增具體產品就需要修改工廠類,添加新具體產品類,違背了封閉開放原則;
簡單工廠必須知道所有需要生產具體產品類,不適用子類過多,子類層級過深的場景