Java语言 封装创建 简单工厂方法(Simple Factory method)

来源:互联网 发布:mac闪讯怎么用 编辑:程序博客网 时间:2024/06/01 08:06

我们用下面的例子,重温一下 Shape 系统。
(实现 factory 模式)常用的方法是把 factory 声明为基类的静态方法(staticmethod)。

ShapeFactory.java

package com.enfo.wd.factory;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.List;abstract class Shape{    public abstract void draw();    public abstract void erase();    public static Shape factory(String type){        if(type.equals("Circle")) return new Circle();        if(type.equals("Square")) return new Square();        throw new RuntimeException("Bad shape creation:"+type);    }} class Circle extends Shape{    @Override    public void draw() {        System.out.println("Circle.draw");    }    @Override    public void erase() {        System.out.println("Circle.erase");    }}class Square extends Shape{    @Override    public void draw() {        System.out.println("Square.draw");          }    @Override    public void erase() {        System.out.println("Square.erase");    }}public class ShapeFactory {    String shlist[]={"Circle","Square","Square","Circle","Circle","Square"};    @SuppressWarnings("rawtypes")    List shapes=new ArrayList();    @SuppressWarnings({ "unchecked", "rawtypes" })    public void test(){        Iterator it=Arrays.asList(shlist).iterator();        while (it.hasNext())            shapes.add(Shape.factory(it.next().toString()));            it=shapes.iterator();        while(it.hasNext()){            Shape s=(Shape) it.next();            s.draw();            s.erase();        }    }    public static void main(String[] args) {        ShapeFactory shape=new ShapeFactory();        shape.test();    }}

factory() 方法需要传入一个参数来决定要创建的 Shape 的具体类型; 在上面的例子里(参数)碰巧是一个字符串(String),它也可以是其它任意类型。当加入新的 Shape 类型的时候(我们假定被创建对象的初始化代码是来自系统以外的,而不是像上面那个例子使用一个硬编码(hard-coded)的数组),系统唯一需要改动的代码就是 factory( )方法。为了促使创建对象的代码只包含在 factory( )方法里,特定类型的 Shape 类的构造函数都被声明为 package 权限,这样一来只有 factory( )方法可以调用这些构造函数,而位于包(package)以外的那部分代码则没有足够的权限(调用这些构造函数)。

阅读全文
0 0