[英]I am implementing factory design pattern in java
我正在 Java 中實現工廠設計模式,我想在抽象類中保留一個重載方法。 會不會違反工廠模式的概念? 或者請建議這是否是實現工廠設計模式的正確方法?
abstract class A{
void meth(int a);
void meth(int a,int b);
}
class Factory{
public static A factoryMethod(int a){
if(a==1){
return new Ob1();
}else{
return new Ob2();
}
}
}
class Ob1 extends A{
void meth(int a){}
void meth(int a,int b){}
}
要首先實現Factory Pattern
您需要考慮Factory
將生產什么。 讓我們生產Vehicles
。
public VehicleFactory {
public Vehicle newVehicle(String type) {
...
}
}
這將根據下面的類層次結構生成Vehicles
。
public interface Vehicle {
public List<Door> getDoors();
}
public class Motorcycle implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>emptyList();
}
}
public class SportsCar implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>unmodifiableList(Arrays.asList(new Door("driver"), new Door("passenger"));
}
}
public class Hatchback implements Vehicle {
public List<Door> getDoors() {
return Collections.<Door>unmodifiableList(Arrays.asList(new Door("driver"), new Door("passenger"), new Door("back"));
}
}
那么你的VehicleFactory
方法newVehicle(...)
可能看起來像
public Vehicle newVehicle(String type) {
if ("motorcycle".equals(type)) { return new Motorcycle(); }
if ("sports car".equals(type)) { return new SportsCar(); }
if ("hatchback".equals(type)) { return new Hatchback(); }
return null;
}
現在的主要問題是“你為什么要這樣做?”
有時您需要一個漂亮干凈的界面來構建許多相關項目。 您為相關項目提供一個接口和一個工廠來構建它們。 這允許使用這部分軟件的人簡單地拉入接口類和 ItemFactory。 他們看不到單獨的細節,這簡化了他們的代碼。
由於你在上面的代碼中隱藏了所有Vehicles
的實現細節,如果你有一個編程錯誤(或想添加一些東西),你可以將其中一個Vehicles
(或添加一個新的Vehicle
)修復到工廠並重新 -釋放包含VehicleFactory
的庫(JAR 文件)。
您知道其他人一直在使用VehicleFactory
方法,因此您不必擔心他們的代碼在編譯時被破壞,除非您不小心,否則您也可以確保它在運行時可以工作。
這與說行為不會改變是不同的。 Vehicle
的新實現將返回,希望嵌入的錯誤更少。 此外,由於他們沒有要求您可能已經添加的“新車”,他們不會看到它們,直到他們調用newVehicle("station wagon")
或類似的東西。
此外,您可以更改Vehicles
的構建方式。 例如,如果您后來決定不想要簡單的“一次性構建”實現樣式,則可以像這樣更改 'newVehicle(...)'
public Vehicle newVehicle(String type) {
Chassis chassis;
if ("motorcycle".equals(type)) {
chassis = new TwoWheelChassis();
} else {
chassis = new FourWheelChassis();
}
return new ComponentVehicle(chassis, getDoorCount(type));
}
其中ComponentVehicle
實現了Vehicle
並且由於某種原因需要一個顯式的Chassis
對象。
--- 更新查看評論中的“方法數量”問題---
Factory pattern
實際上並不是關於方法的數量,而是關於一種能夠從一個或多個具體事物中構建抽象事物的方法。
所以在上面的例子中,我可以有
public VehicleFactory {
public Vehicle newVehicle(String type) { ... }
public Vehicle newRedVehicle(String type) { ... }
public Vehicle newBlackVehicle(String type) { ... }
}
並且對於Vehicle
的類型,它們都是可接受的工廠方法,但對於Vehicle
的顏色,它們不是面向工廠的方法。
要獲得可以同時處理 Type 和 Color 的工廠方法,工廠方法
public Vehicle newVehicle(String type, String color) { ... }
可能會添加。 請注意,有時某些組合沒有任何意義,因此可能不值得將所有工廠方法打包到一個工廠方法中。
工廠對象中的任何方法都不是真正的工廠方法,除非它有可能返回多個接口的基本類型。 同樣,如果您必須指定如何在方法之外構建對象,它也不是工廠方法。
如果您需要將如何構建Vehicle
控制權傳遞給您的“它本來是一個工廠”方法的客戶端,同時提供他們以理智的方式使用它的一些安全性,那么您需要Builder pattern
。 可以在下面的客戶端代碼中看到Builder Pattern
如何不同的示例
VehicleBuilder builder = new VehicleBuilder();
builder.addDoor("driver");
builder.addDoor("passenger");
builder.paintVehicle("red");
Vehicle vehicle = builder.getVehicle();
工廠模式是一個模糊的術語,不是嗎? 有簡單工廠、工廠方法和抽象工廠。 我想你在這里談論的是一個簡單的工廠。 https://www.codeproject.com/Articles/1131770/Factory-Patterns-Simple-Factory-Pattern
這是 Java 工廠實現的示例。
假設我們需要創建多種貨幣支持,並且代碼也應該是可擴展的以適應新的貨幣。 這里我們把 Currency 作為接口,所有的貨幣都是 Currency 接口的具體實現。
工廠類將根據國家創建貨幣並返回將存儲在接口類型中的具體實現。 這使代碼具有動態性和可擴展性。
這是 Java Factory
模式的完整代碼示例。
Currency
類:
interface Currency {
String getSymbol();
}
// Concrete Rupee Class code
class Rupee implements Currency {
@Override
public String getSymbol() {
return "Rs";
}
}
// Concrete SGD class Code
class SGDDollar implements Currency {
@Override
public String getSymbol() {
return "SGD";
}
}
// Concrete US Dollar code
class USDollar implements Currency {
@Override
public String getSymbol() {
return "USD";
}
}
Factory
:
// Factory Class code
class CurrencyFactory {
public static Currency createCurrency (String country) {
if (country. equalsIgnoreCase ("India")){
return new Rupee();
}else if(country. equalsIgnoreCase ("Singapore")){
return new SGDDollar();
}else if(country. equalsIgnoreCase ("US")){
return new USDollar();
}
throw new IllegalArgumentException("No such currency");
}
}
// Factory client code
public class Factory {
public static void main(String args[]) {
String country = args[0];
Currency rupee = CurrencyFactory.createCurrency(country);
System.out.println(rupee.getSymbol());
}
}
查看更多Java 工廠模式示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.