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; } } }优点:
对象创建与使用的分离减少复杂的类名使用提高系统灵活性缺点:
工厂类一旦职责过重,整个系统都要受到影响增加了系统的复杂程度和理解难度不利于系统的扩展和维护适用场景:
工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑过于复杂。客户端只知道传入工厂类的参数,对于如何创建对象并不关心。