2012-08-16 40 views
5

Tôi đã tạo lớp sau với phương thức main, tạo ra phiên bản mới Application và các phiên bản ApplicationModel, ApplicationViewApplicationController cho riêng Application này.Làm thế nào để có được thể hiện cụ thể của lớp từ một lớp khác trong Java?

public class Application 
{ 

    // Variables 

    private ApplicationSettings   settings; 
    private ApplicationModel   model; 
    private ApplicationView    view; 
    private ApplicationController  controller; 

    // Constructor 

    public Application() 
    { 
     settings  = new ApplicationSettings(); 
     model   = new ApplicationModel(); 
     view   = new ApplicationView(model); 
     controller  = new ApplicationController(); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
     Application application = new Application(); 
    } 

    // Getters for settings, model, view, controller for instance of Application 

} 

Tôi biết rằng sẽ luôn chỉ có một trường hợp duy nhất là Application.

Và tôi muốn có ví dụ cụ thể này trong các lớp học ApplicationModel, ApplicationViewApplicationController của mình.

Làm cách nào có thể?

Trả lời

6

Tôi sẽ sử dụng một singleton trên lớp Ứng dụng.

Đặt phương thức public static để trả lại phiên bản ứng dụng duy nhất của bạn.

public class Application 
{ 
    private Application() { } // make your constructor private, so the only war 
           // to access "application" is through singleton pattern 

    private static Application _app; 

    public static Application getSharedApplication() 
    { 
     if (_app == null) 
      _app = new Application(); 
     return _app; 
    } 
} 

Bạn có thể đọc thêm về mẫu thiết kế Singletonhere.

Mỗi khi bạn cần một và chỉ Application Ví dụ, bạn làm:

Application app = Application.getSharedApplication(); 
+0

Đây là giải pháp hoàn hảo cho tôi. Cảm ơn bạn rất nhiều! –

+0

Và, có thể, bạn đã mắc lỗi đánh máy. 'Application _app' nên tĩnh, nếu nó được tham chiếu từ phương thức tĩnh.Xin vui lòng, sửa nó, vì tôi không chắc chắn. :) –

+1

@EdwardRuchevits: vâng! Đó không phải là lỗi đánh máy. Tôi chỉ quên đặt từ khóa vào đó. Nó ** phải ** ** tĩnh **. –

2

Bạn muốn sử dụng mẫu thiết kế Singleton nếu bạn cần đảm bảo sẽ chỉ có một phiên bản Ứng dụng và bạn cần nó để có thể truy cập được bởi các lớp đó. Tôi sẽ không bình luận nếu đó là cách tốt nhất để xây dựng ứng dụng của bạn, nhưng nó sẽ đáp ứng các yêu cầu trong câu hỏi của bạn.

Singleton design pattern tutorial

+0

Vâng, điều đó hoàn toàn phù hợp với tôi. Cảm ơn bạn! –

0

tôi đã cố gắng này ngay bây giờ, bạn có thể vượt qua this như một arg constructor trong constructor của Application đến các lớp học khác (giả định có một tham chiếu được khai báo cho lớp chính). Bằng cách đó bạn rõ ràng có thể tạo nhiều phiên bản của lớp Application. Nếu đó là những gì bạn muốn ...

+0

Tôi chỉ muốn tạo một phiên bản 'Ứng dụng'. Dù sao, cảm ơn bạn đã trả lời của bạn. –

2

Thay đổi hàm tạo của lớp Application thành private và gửi đối tượng this đến các lớp ApplicationXxx.

private Application() 
{ 
    settings  = new ApplicationSettings(this); 
    model   = new ApplicationModel(this); 
    view   = new ApplicationView(this, model); 
    controller  = new ApplicationController(this); 
} 

Bạn sẽ có thể gọi new trên lớp Application từ bên trong phương pháp main.

ApplicationSettings, ApplicationModel, ApplicationViewApplicationController của bạn phải được cập nhật để lấy đối tượng Application trong công cụ xây dựng của chúng.

+0

Cảm ơn bạn đã trả lời. Tôi đã sử dụng cách tiếp cận này, nhưng đó không phải là những gì tôi muốn đạt được. Bây giờ tôi muốn sử dụng mẫu thiết kế Singleton, theo đề xuất của Pablo Santa Cruz và smcg. –

+0

@EdwardRuchevits Đừng quên rằng [Singletons là ác] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons). – maba

1

Thêm thông số của loại Application vào các hàm tạo của vật liệu tổng hợp. Khi bạn tạo các cá thể của chúng, chỉ cần vượt qua this. Ví dụ:

public class Application { 
    String s = "Setting"; 
    class ApplicationSettings { 
    Application sc; 
    ApplicationSettings(Application sc){ 
     this.sc = sc; 
     System.out.println(sc.s); 
    } 
    } 

    // Variables 

    private ApplicationSettings settings; 

    // Constructor 

    public Application() 
    { 
    settings = new ApplicationSettings(this); 
    } 

    // Main method 

    public static void main(String[] args) 
    { 
    Application application = new Application(); 

    } 

    // Getters for settings, model, view, controller for instance of Application 

} 
+0

Tôi nghĩ rằng, Singleton pattern sẽ tốt hơn cho tôi, bởi vì tôi chỉ muốn một ví dụ của 'Application' của tôi. Nhưng cảm ơn bạn đã trả lời! –

Các vấn đề liên quan