日期:2014-05-20  浏览次数:20598 次

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

如果要设计一个图形系统,请你设计基本的图形元件(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) {