【问题标题】:How do I restrict object creation not more than 3 in Java class?如何在 Java 类中限制对象创建不超过 3 个?
【发布时间】:2021-03-20 21:06:35
【问题描述】:

如何在 Java 类中限制对象创建不超过 3 个?

你能告诉我我该怎么做吗?

【问题讨论】:

  • 您指的是 erm、tripleton 设计模式吗?例如,给定类的三个实例?
  • 我不明白你到底是什么问题...
  • 这似乎是某些课程中常见的家庭作业/问题。我已经多次看到这个问题(几乎总是数字为 3),但我还没有看到这个限制的充分理由。
  • 如果这是作业,我们可以加一个作业标签吗?

标签: java design-patterns


【解决方案1】:

我们可以通过在单例设计模式中稍作修改来限制为特定类创建对象,如下所示:

public class LimitClass {

    private static LimitClass limInstance;
    public static int objCount = 0;

    private LimitClass(){
        objCount++;
    }

    public static synchronized LimitClass getLimInstance(){
        if(objCount < 3 ){
            limInstance = new LimitClass();
        }
        return limInstance;
    }
}

public class LimitObjectCreationTest {

    public static void main(String[] args) {

        LimitClass obj1 = LimitClass.getLimInstance();
        LimitClass obj2 = LimitClass.getLimInstance();
        LimitClass obj3 = LimitClass.getLimInstance();
        LimitClass obj4 = LimitClass.getLimInstance();
        LimitClass obj5 = LimitClass.getLimInstance();
        LimitClass obj6 = LimitClass.getLimInstance();

        System.out.println(obj1);
        System.out.println(obj2);

        System.out.println(obj3);
        System.out.println(obj4);
        System.out.println(obj5);
        System.out.println(obj6);
      }
}

以上代码的输出如下:

com.pack2.LimitClass@19821f
com.pack2.LimitClass@addbf1
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816

创建三个不同的对象后,它会一次又一次地重复相同的第三个对象。它没有创建不同的对象。

【讨论】:

    【解决方案2】:

    通过工厂实例化您的类(请参阅设计模式)并使用简单的计数器将其限制为 3 个实例。

    【讨论】:

    • 简单的静态计数器并同步工厂方法。
    【解决方案3】:

    您需要修改后的单例。看到这个 - 相同的OOPS (Design Patterns)

    【讨论】:

      【解决方案4】:

      工厂模式是要走的路。或者可以使用静态计数器。需要注意线程安全。

      【讨论】:

        【解决方案5】:

        您还可以查看 Apache Commons 的 ObjectPool。源代码免费提供...

        【讨论】:

          【解决方案6】:

          为什么不分配 limInstance=null ;在其他情况下 getLimInstance() ?在那种情况下,它不会提供 obj3 副本?

           public static synchronized InstanceClass getLimInstance()
          {
                  if(objCount < 3 ){
                      limInstance = new InstanceClass();
                  }
                  else
                  {
                      limInstance=null;
                  }
                  return limInstance;
              }
          
          
          public class LimitObjectCreationTest {
          
          
             public static void main(String[] args) {
              InstanceClass obj1 = InstanceClass.getLimInstance();
              InstanceClass obj2 = InstanceClass.getLimInstance();
              InstanceClass obj3 = InstanceClass.getLimInstance();
              InstanceClass obj4 = InstanceClass.getLimInstance();
              InstanceClass obj5 = InstanceClass.getLimInstance();
              InstanceClass obj6 = InstanceClass.getLimInstance();
          
              System.out.println(obj1);
              System.out.println(obj2);
          
              System.out.println(obj3);
              System.out.println(obj4);
              System.out.println(obj5);
              System.out.println(obj6);
          
              System.out.println(obj3);
            }
          

          }

          结果是这样的:

          come.classinstance.InstanceClass@4a5ab2

          come.classinstance.InstanceClass@1888759

          come.classinstance.InstanceClass@6e1408

          come.classinstance.InstanceClass@6e1408

          【讨论】:

            【解决方案7】:

            您需要修改单例并创建三个对象。在每个方法返回对象中编写三个方法,如返回不同的三个对象并在需要时使用。它主要使用不需要将变量或对象声明为静态,因为总是返回相同的对象。

            【讨论】:

              【解决方案8】:

              如果要将类实例限制为 N,请继续创建一个新实例并将其添加到集合中,直到集合的大小小于 N。否则随机返回 N 个实例中的任何一个。

              public class LimitClass {
                  private static List<LimitClass> ObjectPool = new ArrayList<LimitClass>();
                  public static int objCount = 0;
                  private static Random randomizer = new Random();
                  private LimitClass(){
                      objCount++;
                  }
                  public static synchronized LimitClass getLimInstance(){
                      if(objCount < 3 ){
                          LimitClass lc = new LimitClass();
                          ObjectPool.add(lc);
                          return lc;
                      }
                      return ObjectPool.get(randomizer.nextInt()%3);
                  }
              }
              
              public class LimitObjectCreationTest {
                  public static void main(String[] args) {
                      LimitClass obj1 = LimitClass.getLimInstance();
                      LimitClass obj2 = LimitClass.getLimInstance();
                      LimitClass obj3 = LimitClass.getLimInstance();
                      LimitClass obj4 = LimitClass.getLimInstance();
                      LimitClass obj5 = LimitClass.getLimInstance();
                      LimitClass obj6 = LimitClass.getLimInstance();
                      System.out.println(obj1);
                      System.out.println(obj2);
                      System.out.println(obj3);
                      System.out.println(obj4);
                      System.out.println(obj5);
                      System.out.println(obj6);
                      System.out.println(obj3);  
                  }
              }
              
              
              
              
                  LimitClass@1788a393
                  LimitClass@460c2da6
                  LimitClass@4283a56d
                  LimitClass@460c2da6
                  LimitClass@1788a393
                  LimitClass@4283a56d
                  LimitClass@4283a56d
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-11-22
                • 2019-09-27
                • 2017-11-30
                • 2019-02-27
                • 2021-06-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多