上一篇文章写了简单工厂模式,解决了单个类冗余等问题,但是也有一些其他的问题,所有的判断类型的工作都在工厂类中实现,导致工厂类过于沉重。如果有不同的形状添加进来就必须要修改工厂类的源码,不符合开闭原则。接下来我们使用一种新的设计模式,工厂设计模式。
工厂设计模式是给每一个产品对象提供一个工厂类,针对不同的产品提供不同的产品。定义一个用于创建对象的接口,让子类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();
}
}
工厂设计模式的基本用法就是上面这个样子了
来源:CSDN
作者:你得努力了
链接:https://blog.csdn.net/JIY743761374/article/details/103483323