唐磊的个人博客

SimpleFactory

简单工厂

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

类图如图所示

下面还是通过一个例子来说明吧

用刘伟老师的实验里的例子。

使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、方形(Rectangle)和三角形(Triangle) 对象,每个几何图形都要有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnsupportedShapeException,绘制类图并编程实现。

shape类:

package com.i3zhai.inter;

/*************************

  • Module: Shape.java

  • Author: Administrator

  • Purpose: Defines the Interface Shape

*************************/

import java.util.*;

/\ @pdOid 6d55d9ad-98d7-4bc0-86af-fc06db1c6faa */

public interface Shape {

/\ @pdOid d3231e85-bfea-41dc-b1c3-b20764909fe9 */

void draw();

/\ @pdOid 0ecca84e-b591-411f-9240-8f951b88f59c */

void erase();

}

实现类:

package com.i3zhai.iml;

/*************************

  • Module: Circle.java

  • Author: Administrator

  • Purpose: Defines the Class Circle

*************************/

import com.i3zhai.inter.Shape;

/\ @pdOid 7b0970a0-51d8-4082-8bdc-c1d446992564 */

public class Circle implements Shape {

public void draw()

{

System.out.println(“Cicle draw”);

}

public void erase()

{

System.out.println(“Cicle erase”);

}

}

package com.i3zhai.iml;

/*************************

  • Module: Rectangle.java

  • Author: Administrator

  • Purpose: Defines the Class Rectangle

*************************/

import com.i3zhai.inter.Shape;

/\ @pdOid 4278da12-2f32-4090-be12-a2367726927e */

public class Rectangle implements Shape {

public void draw()

{

System.out.println(this.getClass() + ” :draw”);//难得写了 直接这样区分吧

}

public void erase()

{

System.out.println(this.getClass() + ” :erase”);

}

}

Triange类的实现一样。不贴代码了。

工厂类:package com.i3zhai;

/*************************

  • Module: ShapeFactory.java

  • Author: Administrator

  • Purpose: Defines the Class ShapeFactory

*************************/

import com.i3zhai.iml.Circle;

import com.i3zhai.iml.Rectangle;

import com.i3zhai.iml.Triangle;

import com.i3zhai.inter.Shape;

/\ @pdOid fce0c368-7a6f-4f1e-910a-47be9d5eb099 */

public class ShapeFactory {

/** @param shape

* @pdOid e37c9785-6431-4e2b-a880-f4ed2d0a94de */

public static Shape createShape(String shape) {

if(“circle”.equalsIgnoreCase(shape))

return new Circle();

if(“rectangle”.equalsIgnoreCase(shape))

return new Rectangle();

if(“Triangle”.equalsIgnoreCase(shape))

return new Triangle();

throw new UnsupportedShapeException();

}

再写个解析配置文件XML的工具类:

package com.i3zhai.util;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

public class XMLUtil

{

public static Object getType()

{

try

{

DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = dFactory.newDocumentBuilder();

Document doc;

doc = builder.parse(new File(“config.xml”));

NodeList nl = doc.getElementsByTagName(“typeName”);

Node classNode=nl.item(0).getFirstChild();

String cName=classNode.getNodeValue();

return cName;

}

catch(Exception e)

{

e.printStackTrace();

return null;

}

}

}

}

配置文件

<?xml version=”1.0”?>



rectangle1

在上面typename里面输入要构造的图形名称 就可以了。

这样就实现了不改源代码 构造不同的图形产品。满足OCP。

tanglei wechat
欢迎扫描二维码关注我的微信公众号