一种呢?
请使用简单工厂模式设计一个创立不同几何形状,如圆形,方形和三角形实例的描图员(Art Tracer)系统。每个几何图形都要有画出draw()和擦去erase()两个方法。当描图员接到指令,要求创立不支持的几何图形时,要提出BadShapeException例外。
请简单举例说明描图员系统怎样使用。
在简单工厂模式的定义(见图4)中和花果园例子中,factory()方法都是属于实例的, 而非静态的或是类的方法。factory()方法可不可以是静态的方法呢?
问答题答案
对整个系统而言,工厂模式把具体使用new操作符的细节包装和隐藏起来。当然只要程序是用Java语言写的, Java语言的特征在细节里一定会出现的。
图3.(简单工厂模式定义的类图),是精减后的框架性类图,用于给出这一模式的准确而精练的定义。产品(Product)类到底会有几种,则要对每个系统作具体分析。
这里给出问题的完整答案。描图员(Art Tracer)系统的UML如下
系统的源代码如下
package com.javapatterns.simplefactory.exercise;
public class ArtTracer
{
public Shape factory(String which) throws BadShapeException
{
if (which.equalsIgnoreCase("circle"))
{
return new Circle();
}
else if (which.equalsIgnoreCase("square"))
{
return new Square();
}
else if (which.equalsIgnoreCase("triangle"))
{
return new Triangle();
}
else
{
throw new BadShapeException(which);
}
}
}
代码清单8. ArtTracer类的源代码。
package com.javapatterns.simplefactory.exercise;
public interface Shape
{
void draw();
void erase();
}
Java语言简单工厂创立性模式介绍(6)
时间:2010-12-17
代码清单9. Shape接口的源代码。
package com.javapatterns.simplefactory.exercise;
public class Square implements Shape
{
public void draw()
{
System.out.println("Square.draw()");
}
public void erase()
{
System.out.println("Square.erase()");
}
}
代码清单10. Square类的源代码。
package com.javapatterns.simplefactory.exercise;
public class Circle implements Shape
{
public void draw()
{
System.out.println("Circle.draw()");
}
public void erase()
{
System.out.println("Circle.erase()");
}
}
代码清单11. Circle类的源代码。
package com.javapatterns.simplefactory.exercise;
public class Triangle implements Shape
{
public void draw()
{
System.out.println("Triangle.draw()");
}
public void erase()
{
System.out.println("Triangle.erase()");
}
}
代码清单12. Triangle类的源代码。
package com.javapatterns.simplefactory.exercise;
public class BadShapeException extends Exception
{
public BadShapeException(String msg)
{
super(msg);
}
}
代码清单13. BadShapeException类的源代码。
描图员(Art Tracer)系统使用方法如下
try
{
ArtTracer art = new ArtTracer();
art.factory("circle");
art.factory("square");
art.factory("triangle");
art.factory("diamond");
}
catch(BadShapeException e)
{
...
}
注意对ArtTracer类提出菱形(diamond)请求时,会收到BadShapeException例外。
显然factory()可以是静态的或是类的方法。本文这样介绍简单工厂模式,是为了能 |