2010-02-24 94 views
4

嗨,嗨,我想放在對象創建的限制意味着一個類最多可以有4個對象不超過如何實現這一目標?OOPS(設計模式)

+0

它是依賴於語言的。你對哪種語言感興趣? – 2010-02-24 05:14:05

+0

值得一讀Steve Yegge對Singleton模式的譴責,看看這些警告是否適用於你:http://steve.yegge.googlepages.com/singleton-considered-stupid 你班上的客戶不應該知道該課程的實例有限。首先,這使得單元測試更加困難。 – RossFabricant 2010-02-24 05:50:05

+2

你想要完成什麼樣的世界? – 2010-02-24 05:53:28

回答

10

一種方法是使用一個對象工廠創建至多4個實例。這是一個有趣的需求......對象池是否會滿足相同的需求?

+1

對於有限的工廠和對象池均爲+1。 – LiraNuna 2010-02-24 05:14:29

+0

帶有對象池或緩存的工廠類將成爲此處的途徑 – 2010-03-11 08:52:14

3

您可以計算使用靜態類屬性創建的實例的數量以存儲計數。這可以在類構造函數中完成,也可以使用工廠模式。在不知道目標語言的情況下更準確地回答這個問題有點困難。

3

嘗試修改Singleton模式。您可以使用計數變量。你需要保持構造函數爲私有的,以控制no。的實例。

+0

該變體稱爲MultiTon :) – malaverdiere 2010-02-24 05:59:04

+0

@mlaverd - 同意:) – Padmarag 2010-02-24 07:11:29

0

最簡單的方法是使用名爲「count」的類級屬性,並在構造函數中確保「count」不超過某個數字。

//pseudocode 
class foo 
    static count = 0 

    def constructor() 
    if count < 4 
     //create object 
    else 
     //there are too many! 
+4

在這種情況下,每個對象都將擁有自己的計數副本,將始終爲0.計數變量需要是靜態的。 – Padmarag 2010-02-24 05:17:43

+0

這是僞代碼,它不需要完美。 – 2010-02-24 14:48:55

+0

,但在必要的基本應該是正確的(因爲他們現在) – peterchen 2010-04-19 11:10:51

1

一種實現方式是Singleton設計模式, 每當我們打個電話,以創建一個實例,請檢查已創建實例的計數,如果實例數已經達到4,然後用您的應用程序的同一個實例。 TO有一個計數,Creat Static Int Counter = 0;並不斷增加以獲得結果。

0

這是短碼snippest,將得到上述結果,在c#

sealed class clsInstance 
    { 
     public static int count = 0; 
     private static readonly clsInstance inst = new clsInstance(); 
     clsInstance() 
     { 

     } 

     public static clsInstance Inst 
     { 
      get 
      { 
       if (count < 4) 
       { 

        Console.WriteLine("object : " + count); 
        count++; 
        return inst; 
       } 
       return null; 
      } 
     } 


    } 

    class MainClass 
    { 
     public static void Main(String[] args) 
     { 
      clsInstance c1 = clsInstance.Inst; 
      clsInstance c2 = clsInstance.Inst; 
      clsInstance c3 = clsInstance.Inst; 
      clsInstance c4 = clsInstance.Inst; 
      Console.ReadLine(); 
      clsInstance c5 = clsInstance.Inst; 
      Console.ReadLine(); 
     } 
    }