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