简单工厂模式
Simple Factory Pattern:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
角色:工厂角色、抽象产品角色、具体产品角色
代码如下
抽象产品角色
public interface Chart {
public void display();
}
具体产品角色
public class LineChart implements Chart{
public LineChart() {
System.out.println("创建条状图");
}
@Override
public void display() {
System.out.println("显示条状图");
}
}
public class PieChart implements Chart {
public PieChart() {
System.out.println("创建饼状图");
}
@Override
public void display() {
System.out.println("显示饼状图");
}
}
工厂角色
public class ChartFactory {
public static Chart getChart(String type) {
Chart chart = null;
if ("pie".equalsIgnoreCase(type)) {
// 创建饼状图
System.out.println("创建饼状图");
chart = new PieChart();
} else if ("line".equalsIgnoreCase(type)) {
// 创建条状图
System.out.println("创建条状图");
chart = new LineChart();
}
return chart;
}
}
客户端
public class Client {
public static void main(String[] args) {
/* Chart chart = ChartFactory.getChart("line");
chart.display();*/
String chartType = XMLUtil.getChartType();
Chart chart = ChartFactory.getChart(chartType);
chart.display();
}
}
由于在测试中需要去控制代码参数,违反开闭原则,可以将其拆解至配置文件中,得到一个工具类
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<chartType>line</chartType>
</config>
public class XMLUtil {
public static String getChartType(){
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document;
document = builder.parse("src//com//nq/SFP//config.xml");
NodeList nodeList = document.getElementsByTagName("chartType");
Node node = nodeList.item(0).getFirstChild();
String chartType = node.getNodeValue().trim();
return chartType;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
优点:
- 对象创建与使用的分离
- 减少复杂的类名使用
- 提高系统灵活性
缺点:
- 工厂类一旦职责过重,整个系统都要受到影响
- 增加了系统的复杂程度和理解难度
- 不利于系统的扩展和维护
适用场景:
- 工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑过于复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。