有三个类:A、B、C,A和B都可以生成C的对象,
A在生成C的对象时要判断当前B有没有生成C的对象,如果B已经生成C的对象,那么A就不用再生成C的对象,直接调用C的对象即可。
同样,B在生成C的对象时也要判断当前A有没有生成C的对象。
类似的,这个问题可以扩展到多个类在生成同一个类对象时的处理,应该怎么处理呢?我有点乱,请高手指点一下!可能只需要你的一点点提示,就可以解决这个问题,非常期待......Class A {
private C cc; public void createC() {
处理......
} public C getC() {
return cc;
}
}Class B {
private C cc; public void createC() {
处理......
} public C getC() {
return cc;
}
}Class C { public C() {
}
}
A在生成C的对象时要判断当前B有没有生成C的对象,如果B已经生成C的对象,那么A就不用再生成C的对象,直接调用C的对象即可。
同样,B在生成C的对象时也要判断当前A有没有生成C的对象。
类似的,这个问题可以扩展到多个类在生成同一个类对象时的处理,应该怎么处理呢?我有点乱,请高手指点一下!可能只需要你的一点点提示,就可以解决这个问题,非常期待......Class A {
private C cc; public void createC() {
处理......
} public C getC() {
return cc;
}
}Class B {
private C cc; public void createC() {
处理......
} public C getC() {
return cc;
}
}Class C { public C() {
}
}
A,B生成C之前判断对方的C是否为null
不知道这样行不。
class C{
private C c;
private C(){}
public static C newInstance(){c = (c==null? new C() : c); return c;}
}class A{
...
public void createC() {
cc = C.newInstance();
}
}
private static final C c = null;
private C(){}
public static C newInstance(){if (c==null) c=new C();
return c;}
}
class B和class A的实现和class C一样的吗?
private static final C c = null;
private C(){}
public static C newInstance(){if (c==null) c=new C();
return c;}
}
//////////////////////////
上面的代码要报错啊?
private static final C c = new C(); private C() {
} public static C newInstance() {
return c;
}
}
如果分别对A,B,C类都调用一个newInstance方法,那么不就产生了三个C类的实例了吗?
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;class ContextObj{
private Map container=new HashMap();
public ContextObj(){}
public void add(Object obj){
this.container.clear();
if (obj instanceof ObjC){
this.container.put(String.valueOf(obj.hashCode()),obj);
}
}
public Map getContainer(){
return this.container;
}
}class ObjA extends SuperObj{
private ObjA(){}
public static ObjC newInstance(){
ObjC c=ObjC.newInstance();
return c;
}
}class ObjB extends SuperObj{
private ObjB(){}
public static ObjC newInstance(){
ObjC c=ObjC.newInstance();
return c;
}
}class ObjC extends SuperObj{
private ObjC(){}
public static ObjC newInstance(){
ObjC c=new ObjC();
return c;
}
}
public class SingleObject{
public static void main(String[] args){
ContextObj context=new ContextObj();
ObjC ObjA_c=ObjA.create();
context.add(ObjA_c);
ObjC ObjB_c=ObjB.create();
context.add(ObjB_c);
ObjC ObjC_c=ObjC.create();
context.add(ObjC_c); for (int i=0;i<context.getContainer().size();i++){
System.out.println(context.getContainer().size());
}
Iterator itr_values=context.getContainer().values().iterator();
while (itr_values.hasNext()){
System.out.println(((Object)itr_values.next()).toString());
}
}
}
象这样的话,就是不用单例,不用静态的newInstance方法也可以完成功能...
现在虽然对C类实现了单例模式,加上A类和B类也用同样的实现方式.但是这是三个各自独立的类,怎么保证只产生一个C类的实例呢?
-----------------------------------
因为C的实例只能由C自己通过new生成,A、B只是通过C提供的访问唯一实例的方法newInstance来获取该实例,而不是每次newInstance都产生一个,所以始终只有一个C的实例,这就是单例设计模式,呵呵!
//private static ObjC _objc;
private ObjA(){}
public static ObjC newInstance(){
ObjC c=ObjC.newInstance();
return c;
}
}class ObjB {
//private static ObjC _objc;
private ObjB(){}
public static ObjC newInstance(){
ObjC c=ObjC.newInstance();
return c;
}
}class ObjC {
private static ObjC _objc;
private ObjC(){}
public static ObjC newInstance(){
if (_objc==null)
_objc=new ObjC();
return _objc;
}
}
的确象这样写就可以达到效果.只要不在A类和B类中再声明ObjC这个类的实例就行了 ...
public A() {
}
public void useC() {
C cc = C.getInstance();
}
}class B { public B() {
} public void useC() {
C cc = C.getInstance();
}
}class C {
private static C cc = null;
private C() {
}
public static synchronized C getInstance() {
if (cc == null) {
cc = new C();
}
return cc;
}
}