小弟想完成下面这个面试题,想用工厂模式来完成,但是不知道写的对不对。
请大家帮忙给看看这样写行不呀。
如果要设计一个图形系统,请你设计基本的图形元件(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) {