您的位置:首页 > 编程语言 > Java开发

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

2017-08-29 09:00 507 查看
我们用下面的例子,重温一下 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)以外的那部分代码则没有足够的权限(调用这些构造函数)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息