工厂模式

允我心安 提交于 2019-12-10 22:45:55

上一篇文章写了简单工厂模式,解决了单个类冗余等问题,但是也有一些其他的问题,所有的判断类型的工作都在工厂类中实现,导致工厂类过于沉重。如果有不同的形状添加进来就必须要修改工厂类的源码,不符合开闭原则。接下来我们使用一种新的设计模式,工厂设计模式。

工厂设计模式是给每一个产品对象提供一个工厂类,针对不同的产品提供不同的产品。定义一个用于创建对象的接口,让子类jue哪一个类实例化。工厂模式会让一个类的实例化延迟到它的子类。

 定义一个图形工厂 


public interface GraphicalFactory {
    public Graphical createGraphical();
}

然后分别给圆形、三角形、方形定义工厂类

public class CircularFactory implements GraphicalFactory {
    @Override
    public Graphical createGraphical() {
        return new Circular();
    }
}


public class SquareFactory implements  GraphicalFactory{
    @Override
    public Graphical createGraphical() {
        return new Square();
    }
}


public class TriangleFactory implements GraphicalFactory{
    @Override
    public Graphical createGraphical() {
        return new Triangle();
    }
}

然后接下来看一下客户端

public class Client {
    public static void main(String[] args) {
       GraphicalFactory factory = new TriangleFactory();
        Graphical graphical  = factory.createGraphical();
        graphical.draw();

    }
}

根据客户端定义的不同的工厂类来获取不同的图形

也可以使用xml的方式来配置到底要使用哪一个

public class XmlUtil {
    private static final String CLASS_PATH = "com.jiy.designpattern.create.factory.";

    public static Object getFactory(){
        //创建文档对象
        try {
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dFactory.newDocumentBuilder();
            Document doc = null;
            doc = dBuilder.parse(new File("src\\main\\resources\\config.xml"));
            //获取图像类型的结点
            NodeList nodeList = doc.getElementsByTagName("className");
            //获取该结点下集合结点下标为0下的第一个子节点
            Node node = nodeList.item(0).getFirstChild();
            //获取结点值并去空
            String cName = node.getNodeValue();
            //使用反射获取class对象
           Class clazz = Class.forName(CLASS_PATH + cName);
           Object object = clazz.newInstance();
           return object;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

再来看一下客户端

public class Client {
    public static void main(String[] args) {
     GraphicalFactory factory = (GraphicalFactory)XmlUtil.getFactory();
        Graphical graphical  = factory.createGraphical();
        graphical.draw();

    }
}

工厂设计模式的基本用法就是上面这个样子了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!