设计模式之抽象工厂模式

    科技2024-01-21  95

    抽象工厂模式
    相关概念:产品等级结构、产品族

    Abstract Factory Pattern:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

    角色:抽象工厂、具体工厂、抽象产品、具体产品

    代码

    // 抽象产品-Button public interface Button { public void display(); } // 抽象产品-文本框 public interface TextField { public void display(); } / // 具体产品-春天按钮 public class SpringButton implements Button { @Override public void display() { System.out.println("显示浅绿色按钮"); } } // 具体产品-夏天按钮 public class SummerButton implements Button { @Override public void display() { System.out.println("显示浅蓝色按钮"); } } // 具体产品-春天文本框 public class SpringTextField implements TextField { @Override public void display() { System.out.println("显示绿色边框文本框"); } } // 具体产品-夏天文本框 public class SummerTextField implements TextField { @Override public void display() { System.out.println("显示蓝色边框文本框"); } } <!--config.xml--> <?xml version="1.0" encoding="UTF-8" ?> <config> <className>com.nq.AFP.SpringSkinFactory</className> </config // 工具类-读取配置文件 public class XMLUtil { public static Object getBean() { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src\\com\\nq\\AFP\\config.xml")); NodeList nodeList = document.getElementsByTagName("className"); Node node = nodeList.item(0).getFirstChild(); String cName = node.getNodeValue().trim(); Class object = Class.forName(cName); return object.newInstance(); } catch (Exception e) { e.printStackTrace(); return null; } } } // 客户端测试类 public class Client { public static void main(String[] args) { SkinFactory skinFactory; skinFactory = (SkinFactory) XMLUtil.getBean(); Button button = skinFactory.createButton(); TextField textField = skinFactory.createTextField(); button.display(); textField.display(); } }
    优点:
    抽象工厂模式隔离了具体类的生成,使得客户端并不需要知道什么被创建。保证客户端始终只使用同一个产品族的对象增加新的产品族很方便,无需修改已有系统,符合开闭原则。
    缺点:

    ​ 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,违背了开闭原则

    使用场景
    1. 一个产品不应当依赖于产品实例如何被创建、组合和表达的细节。 2. 系统中有多个产品族,而每次只使用其中一个产品族。 3. 产品等级结构稳定。在设计完成后不会向系统中增加新的产品等级结构或者删除已有产品等级结构。
    Processed: 0.126, SQL: 8