首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

这样写抽象工厂对不对呀,该怎么解决

2012-02-02 
这样写抽象工厂对不对呀小弟想完成下面这个面试题,想用工厂模式来完成,但是不知道写的对不对。请大家帮忙给

这样写抽象工厂对不对呀
小弟想完成下面这个面试题,想用工厂模式来完成,但是不知道写的对不对。
请大家帮忙给看看这样写行不呀。

如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现

#####################################
抽象工厂类

Java code
public abstract class ShapFactory {    private static ShapFactory sf = null;    private static Object mutex = new Object();    public  static ShapFactory getInstance(){        if(sf==null){                        synchronized (mutex) {                 if(sf==null){                    try {                        return  new ShapFactoryImp();                    } catch (Exception e) {                        e.printStackTrace();                        return null;                    }                }            }        }        return sf;    }    public abstract Rectangle createrectangle();    public abstract Square createSquare();}


########################
抽象工厂实现类
public class ShapFactoryImp extends ShapFactory {

public Rectangle createrectangle() {
// TODO 自动生成方法存根
return new Rectangle();
}

public Square createSquare() {
// TODO 自动生成方法存根
return new Square();
}

}
[/code]



####################
各种形状的父抽象类
Java code
 abstract class Shap {    int lenght;    int weight;    int hight;    abstract void draw();}



########################
矩形类
Java code
public class Rectangle extends Shap {    @Override    void draw() {        System.out.println("I'm Rectangle");    }}


###############
方形类
Java code
public class Square extends Shap{    void draw() {        System.out.println("I'm Square");    }}


[解决办法]
写在那里可以
不过我认为synchronized 关键字加在函数上,仁者见仁,智者见智
[解决办法]
首先你这应该是 Factory Method 而不是 Abstract Factory, Abstract Factory 的定义是
“Provider an interface for creating families of related or dependent objects without specify their concrete classes”
  
对于 “单子” (singleton一般都翻译为单件), 当然是对具体的工厂来实现的
  
再者,单件并不是为了节省内存。使用单件可以保持对象创建的一致性。
[解决办法]
另外,你这里提到了Rectangle、Square,并在工厂里定义了两个方法,分别返回 Rectangle、Square
而你在下面已经明确定义Rectangle、Square都集成了Shape抽象类,那么就不用返回具体类了,例如:
public abstract Shape createrectangle();
public abstract Shape createSquare();
更进一步说,如果以后还有其他的子类的话,比如平行四边形,梯形等等,那么你还得在工厂里加入新的方法
这样莫不如,传递一个字符串进去例如:
public abstract Shape createShape(String shape);
实现中可以这么写:
if(shapeName.equals("Rectangle")) return new Rectangle();
else if(shapeName.equals("Square")) return new Square();
else throw new Exception("创建Shape子类"+shapeName+"不成功");


[解决办法]
很不错,,,,
不过,看看我写的怎么样?
很多人都关闭掉构造方法。都把构造方法public出来了。因此,外部对象依然可以创佳一个工厂对戏那个。因此,你使用的sigton并不算是完全使用。

public abstract class ShapFactory {
private static ShapFactory sf = null;
private static Object mutex = new Object();
public static ShapFactory getInstance(){
if(sf==null){

synchronized (mutex) { 


if(sf==null){
try {
return new ShapFactoryImp();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
}
return sf;
}

/* add by **** for sigton schema on 2008-10-04 */
private ShapFactory(){}
public abstract Rectangle createrectangle();
public abstract Square createSquare();
}

热点排行