簡體   English   中英

我正在用java實現工廠設計模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM