如何在Java类中限制对象创建不超过3个?
如何在Java类中限制对象创建不超过3个如何在Java类中限制对象创建不超过3个?,java,design-patterns,Java,Design Patterns,如何在Java类中限制对象创建不超过3个 你能告诉我怎么做吗?通过工厂实例化你的类(参见设计模式),并使用一个简单的计数器将其限制为3个实例。你需要修改单例。请看这一点-同样的工厂模式是一条路要走。或者可以使用静态计数器。需要注意线程安全。您还可以查看ApacheCommons。源代码免费提供…我们可以通过对Singleton设计模式进行少量修改来限制特定类对象的创建,如下所示: public class LimitClass { private static LimitClass l
你能告诉我怎么做吗?通过工厂实例化你的类(参见设计模式),并使用一个简单的计数器将其限制为3个实例。你需要修改单例。请看这一点-同样的工厂模式是一条路要走。或者可以使用静态计数器。需要注意线程安全。您还可以查看ApacheCommons。源代码免费提供…我们可以通过对Singleton设计模式进行少量修改来限制特定类对象的创建,如下所示:
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);
}
}
在创建三个不同的对象后,它会一次又一次地重复相同的第三个对象。它没有创建不同的对象。为什么不分配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);
}
公共静态同步InstanceClass getLimInstance()
{
如果(对象计数<3){
limInstance=新InstanceClass();
}
其他的
{
limpinstance=null;
}
返回实例;
}
公共类限制ObjectCreationTest{
公共静态void main(字符串[]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();
系统输出打印项次(obj1);
系统输出打印项次(obj2);
系统输出打印LN(obj3);
系统输出打印LN(obj4);
系统输出打印LN(obj5);
系统输出打印LN(obj6);
系统输出打印LN(obj3);
}
}
结果是:
来吧,康斯坦斯。InstanceClass@4a5ab2
来吧,康斯坦斯。InstanceClass@1888759
来吧,康斯坦斯。InstanceClass@6e1408
空的
空的
空的
来吧,康斯坦斯。InstanceClass@6e1408您需要修改singleton并创建三个对象。在每个方法中写入三个方法返回对象,就像返回不同的三个对象一样,并在需要时使用。无需将变量或对象声明为静态,因为始终返回相同的对象。如果要将类实例限制为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
公共类{
私有静态列表ObjectPool=new ArrayList();
公共静态int objCount=0;
私有静态随机发生器=新随机();
私有类(){
objCount++;
}
公共静态类getLimInstance(){
如果(对象计数<3){
LimitClass lc=新的LimitClass();
ObjectPool.add(lc);
返回信用证;
}
返回ObjectPool.get(randomizer.nextInt()%3);
}
}
公共类限制ObjectCreationTest{
公共静态void main(字符串[]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();
系统输出打印项次(obj1);
系统输出打印项次(obj2);
系统输出打印LN(obj3);
系统输出打印LN(obj4);
系统输出打印LN(obj5);
系统输出打印LN(obj6);
系统输出打印LN(obj3);
}
}
LimitClass@1788a393
LimitClass@460c2da6
LimitClass@4283a56d
LimitClass@460c2da6
LimitClass@1788a393
LimitClass@4283a56d
LimitClass@4283a56d
您指的是erm、tripleton设计模式吗?比如,一堂课有三个实例?我不明白你的问题到底是什么……这似乎是某门课程中常见的家庭作业/问题。我已经多次看到这个问题(几乎总是数字为3),但我还没有看到这个限制的好理由。如果这是作业,我们可以添加作业标签吗?简单的静态计数器并同步工厂方法。当回答一个旧问题时,如果您包含一些上下文来解释您的答案是如何帮助的,那么您的答案对其他StackOverflow用户会更有用。请参阅:。
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