有时在工作,可能会出现一些情况,我们不适合使用单例模式,但是又不允许无限制的new同一个对象;
我的思路是设置一个当前对象数量,每创建一个对象则+1,一个对象被回收则-1;大于最大数量则不允许创建对象;方法很简单;
下面是试例代码:
package test; import java.lang.reflect.InvocationTargetException; public class TestStatic { public static void main(String[] args) throws Exception { for (int i = 0; i < 150; i++) { Thread t = new Factory("name" + i); t.start(); } } } class Factory extends Thread{ Test test; public Factory(String name) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException{ this.test = Test.getInstance(name); //this.test = (Test) Class.forName("test.Test").getConstructor(new Class[]{String.class}).newInstance(new Object[]{name}); } public void run(){ test.doSomething(); test = null; } } class Test { String name; public static int count = 0; private static int maxNum = 100; public Test(String name) { count++; System.out.println(name + " is new"); this.name = name; } public static Test getInstance(String name) { while (true) { if (Test.maxNum > count) { return new Test(name); } else { count++; if (count == 1000) { count = 0; System.out.println("recycle"); } System.gc(); } } } public void doSomething() { try { System.out.println(name + "start doSomething"); Thread.sleep(5000); System.out.println(name + "complete doSomething"); } catch (Exception e) { e.printStackTrace(); } } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println(this.name + "is destroyed"); count--; } }
Test类是可能会被多次创建的类,于是我们可以使用类似单例模式的一个方法写一个getInstance方法,在Test类里边添加Test可以创建的最大个数以及当前已经创建的数量;每次getInstance的时候都要做一些验证;如果超过最大数量,则可以做一些相关操作比较调用垃圾回收器,或者提示错误等等;另一个比较重要的操作就是要利用finallize方法;每当一个Test对象被回收之后,就立即更改当前Test的对象数量,以便别人可以获取该Test对象;
ps:这种方法也会存在一个问题,就是如果使用反射机制来生成对象的时候,可能会遇到一些问题;