2012-09-02 79 views
3

我創建了一個類(ProjectsDataAccess)將處理訪問數據庫的構造函數訪問,這是什麼類的可以這樣做:我怎麼能控制在另一類

  1. 接收工程對象,並將其保存到數據庫。
  2. 通過id從數據庫中檢索項目並將其作爲Project對象返回。

這是類psudo代碼:

class ProjectsDataAccess { 

     public void addProject(Project project) { 
      // get the project data from the object and save it to the database 
     } 

     public void getProject() { 
     // get the project data from the database and return new project 
     //object with that data 
     } 

     } 

這是項目目標:

class Project{ 

    private String name; 
    private int id; 

    private Project(){} 

    Project(int id, String name){ 
    this. id = id; 
    this.name = name; 
    } 
    Project(String name){ 
    this. id = // generate id 
    this.name = name; 
    } 
} 

我的問題是我不希望類的用戶創建對象和供應它自己的ID使用這個構造函數Project(int id, String name),但我只想讓ProjectsDataAccess類使用它,以便它能夠從數據庫中檢索數據(包括id),然後使用構造函數設置它。有沒有辦法改變我的設計。

回答

1

一個解決辦法是保持ProjectsDataAccessProject類在同一個包,並構造Project(int id, String name)包可見(無任何改性劑,像現在是)。其他構造函數Project(String name)需要爲public,以便客戶端代碼可見。當然,將客戶端代碼放在不同的包中。

package foo; 

public class ProjectsDataAccess { 

    public void addProject(Project project) { 
     // get the project data from the object and save it to the database 
    } 

    public void getProject() { 
    // get the project data from the database and return new project 
    //object with that data 
    } 

    } 



package foo; 

public class Project { 

    private String name; 
    private int id; 

    private Project(){} 

    Project(int id, String name){ 
     this. id = id; 
     this.name = name; 
    } 

    public Project(String name){ 
     this. id = // generate id 
     this.name = name; 
    } 
} 
+0

我唯一的問題是,我有不同包中的項目類別和ProjectsDataAccess類及其困難的,因爲它包含了項目類的包在客戶端和服務器之間共享移動它。 – Jimmy

+0

但是這是包的主要目標之一:隱藏客戶端代碼的內部。如果您將ProjectsDataAccess和構造函數Project(int id,String name)看作「內部」,那麼它們應該保留在同一個包中。 – dcernahoschi

0

我建議你給用戶返回一個不同的接口,只能用用戶應該調用的方法。

例如:

interface UserProjectInterface 
{ 
    void AnyMethodUserIsSupposedToCall(); 
} 

class Project implements ProjectUserInterface 
{ 
    //constructor won-t be no longer visible to the client class 
    public Project(){} 
} 

那麼只返回接口:

class ProjectsDataAccess { 

    public void addProject(ProjectUserInterfaceproject); 


    public ProjectUserInterfacegetProject getProject() { 
    return new Project(); 
    } 

} 

這個模式有幾種不同的優勢,因爲你沒有暴露的具體類型的客戶端類。


編輯:

如果用戶應該創建UserProjectInterface你可以使用一個工廠,以封裝對象創建(ES AbstractFactory):

interface AbstractProjectFactory 
{ 
    UserProjectInterface CreateProject(); 

} 

,並提供一個實例化具體對象的實現:

public AConcreteProjectFactory implements AbstractProjectFactory 
{ 
    public UserProjectInterface CreateProject() 
    { 
     return new Project(); 
    } 
} 

使用的例子:

//client class: 
AbstractProjectFactory factory = new AConcreteProjectFactory(); 
UserProjectInterface project = factory.CreateProject(); 

ProjectsDataAccess access = new ProjectsDataAccess(); 
access.addProject(project); 
+0

您能解釋更多嗎?因爲用戶需要創建一個新的項目對象並將其傳遞給ProjectsDataAccess。 – Jimmy

+0

感謝您的編輯,現在有意義。那麼,您如何看待dcernahoschi解決方案,您認爲使用工廠模式給我更多的靈活性,或者使構造函數包變得更加複雜。 – Jimmy

+0

那麼,他的答案是正確的。這取決於你的項目的複雜性。通常使用接口和工廠是強制類的解耦和隱藏具體類型的好方法。除了隱藏你的構造函數外,它有很多benefetis。 – Heisenbug

相關問題