具体实施
先说明一点,用Factory Method模式创建对象并不一定会让我们的代码更短,实事上往往更长,我们也使用了更多的类,真正的目的在于这样可以灵活的,有弹性的创建不确定的对象。而且,代码的可重用性提高了,客户端的应用简化了,客户程序的代码会大大减少,变的更具可读性。
标准实现: 这里我采用Bruce Eckel 用来描述OO思想的经典例子 Shape。这样大家会比较熟悉一些。我完全按照图1中所定义的结构写了下面的一段演示代码。这段代码的作用是创建不同的Shape实例,每个实例完成两个操作:draw和erase。具体的创建过程委托?ShapeFactory来完成。
1.a 首先定义一个抽象类Shape,定义两个抽象的方法。
abstract class Shape
{
// 勾画shape
public abstract void draw();
// 擦去 shape
public abstract void erase();
public String name;
public Shape(String aName)
{
name = aName;
}
}
1.b 定义 Shape的两个子类: Circle, Square,实现Shape中定义的抽象方法
// 圆形子类
class Circle extends Shape
{
public void draw()
{
System.out.println("It will draw a circle.");
}
public void erase()
{
System.out.println("It will erase a circle.");
}
// 构造函数
public Circle(String aName)
{
super(aName);
}
}
// 方形子类
class Square extends Shape
{
public void draw()
{
System.out.println("It will draw a square.");
}
public void erase() {
System.out.println("It will erase a square.");
}
// 构造函数
public Square(String aName)
{
super(aName);
}
}
在Java中应用Factory Method设计模式(4)
时间:2010-09-13
1.c 定义抽象的创建器,anOperation调用factoryMethod创建一个对象,并对该对象进行一系列操作。
abstract class ShapeFactory
{
protected abstract Shape
factoryMethod(String aName);
// 在anOperation中定义Shape的一系列行为
public void anOperation(String aName)
{
Shape s = factoryMethod(aName);
System.out.println
("The current shape is: " + s.name);
s.draw();
s.erase();
}
}
1.d 定义与circle和square相对应的两个具体创建器CircleFactory,SquareFactory,实现父类的methodFactory方法
// 定义返回 circle 实例的 CircleFactory
class CircleFactory extends ShapeFactory
{
// 重载factoryMethod方法,返回Circle对象
protected Shape factoryMethod(String aName)
{
return new Circle(aName + "
(created by CircleFactory)");
}
}
// 定义返回 Square
实例的 SquareFactory
class SquareFactory extends ShapeFactory
{
// 重载factoryMethod方法,返回Square对象
protected Shape factoryMethod(String aName)
{
return new Square
(aName + " (created by SquareFactory)");
}
}
1.e 测试类:请注意这个客户端程序多么简洁,既没有罗嗦的条件判断语句,也无需关心ConcreteProduct和ConcreteCreator的细节(因为这里我用anOperation封装了Product里的两个方法,所以连Product的影子也没看见,当然把Product里方法的具体调用放到客户程序中也是不错的)。
class Main
{
public static void main(String[] args)
{
ShapeFactory sf1 = new SquareFactory();
ShapeFactory sf2 = new CircleFactory();
sf1.anOperation("Shape one");
sf2.anOperation("Shape two");
}
}
运行结果如下:
The current shape is: Shape one
(created by SquareFactory)
It will draw a square.
It will erase a square.
The current shape is: Shape two
(cre
|