/** * 抽象产品 - CPU */ public interface CPU { void compute(); } /** * 抽象产品 - 内存 */ public interface Memory { void store(); }2、具体产品
/** * 具体产品 - PC 的 CPU 实现 */ public class PCCPU implements CPU { @Override public void compute() { System.out.println("PC CPU is computing"); } } /** * 具体产品 - PC 的内存实现 */ public class PCMemory implements Memory { @Override public void store() { System.out.println("PC Memory is storing data"); } } /** * 具体产品 - 服务器的 CPU 实现 */ public class ServerCPU implements CPU { @Override public void compute() { System.out.println("Server CPU is computing with high performance"); } } /** * 具体产品 - 服务器的内存实现 */ public class ServerMemory implements Memory { @Override public void store() { System.out.println("Server Memory is storing data with high capacity"); } }3、测试类 ~ 不用抽象工厂模式
/** * 不用抽象工厂模式 */ public class Client { public static void main(String[] args) { // 创建 PC 的组件 CPU pcCPU = new PCCPU(); Memory pcMemory = new PCMemory(); pcCPU.compute(); pcMemory.store(); // 堆代码 duidaima.com // 创建 服务器 的组件 CPU serverCPU = new ServerCPU(); Memory serverMemory = new ServerMemory(); serverCPU.compute(); serverMemory.store(); } }4、新增笔记本的CPU和内存
/** * 具体产品 - 新增笔记本电脑的 CPU 实现 */ public class LaptopCPU implements CPU { @Override public void compute() { System.out.println("Laptop CPU is computing efficiently"); } } /** * 具体产品 - 笔记本电脑的内存实现 */ public class LaptopMemory implements Memory { @Override public void store() { System.out.println("Laptop Memory is storing data efficiently"); } }5、在Client测试类中新增:
// 创建笔记本的 CPU laptopCPU = new LaptopCPU(); laptopCPU.compute(); LaptopMemory laptopMemory = new LaptopMemory(); laptopMemory.store();还是很方便的。
客户端(Client):通过工厂接口来使用产品,而不依赖于具体产品的实现。
/** * 抽象工厂 */ public interface ComputerFactory { CPU createCPU(); Memory createMemory(); }2、具体工厂类
/** * 具体工厂 - PC 工厂 */ public class PCFactory implements ComputerFactory { @Override public CPU createCPU() { return new PCCPU(); } @Override public Memory createMemory() { return new PCMemory(); } } /** * 具体工厂 - 服务器工厂 */ public class ServerFactory implements ComputerFactory { @Override public CPU createCPU() { return new ServerCPU(); } @Override public Memory createMemory() { return new ServerMemory(); } }3、测试类 ~ 抽象工厂模式
public class AbstractFactoryClient { public static void main(String[] args) { // 使用 PC 工厂创建 PC 组件 ComputerFactory pcFactory = new PCFactory(); CPU pcCPU = pcFactory.createCPU(); Memory pcMemory = pcFactory.createMemory(); pcCPU.compute(); pcMemory.store(); // 使用服务器工厂创建服务器组件 ComputerFactory serverFactory = new ServerFactory(); CPU serverCPU = serverFactory.createCPU(); Memory serverMemory = serverFactory.createMemory(); serverCPU.compute(); serverMemory.store(); } }使用抽象工厂模式时,新增笔记本电脑,如何实现?
public class LaptopFactory implements ComputerFactory { @Override public CPU createCPU() { return new LaptopCPU(); } @Override public Memory createMemory() { return new LaptopMemory(); } }5、在测试类中新增
// 使用笔记本工厂 ComputerFactory laptopFactory = new LaptopFactory(); CPU laptopCPU = laptopFactory.createCPU(); Memory laptopMemory = laptopFactory.createMemory(); laptopCPU.compute(); laptopMemory.store();三、新增具体产品时,扩展新的工厂类再在客户端中创建工厂类代码 和 在客户端中直接创建实例代码,有什么本质区别吗?
package javax.xml.parsers; public abstract class DocumentBuilderFactory { // 用于创建 DocumentBuilder 实例 public abstract DocumentBuilder newDocumentBuilder() throws ParserConfigurationException; // 工厂方法,用于获取 DocumentBuilderFactory 的实例 public static DocumentBuilderFactory newInstance() { return FactoryFinder.find(DocumentBuilderFactory.class, "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"); } }(2)具体工厂类:DocumentBuilderFactoryImpl
package org.apache.xerces.jaxp; public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { @Override public DocumentBuilder newDocumentBuilder() throws ParserConfigurationException { return new DocumentBuilderImpl(); } }(3)客户端使用
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class XMLParserExample { public static void main(String[] args) { try { // 获取 DocumentBuilderFactory 实例(抽象工厂) DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 使用工厂创建 DocumentBuilder(具体产品) DocumentBuilder builder = factory.newDocumentBuilder(); // 使用 DocumentBuilder 解析 XML 文档 // 示例代码忽略了具体 XML 文件的解析逻辑 System.out.println("DocumentBuilder created successfully!"); } catch (Exception e) { e.printStackTrace(); } } }2、SAXParserFactory 的应用
package javax.xml.parsers; public abstract class SAXParserFactory { // 创建 SAXParser 的抽象方法 public abstract SAXParser newSAXParser() throws ParserConfigurationException, SAXException; // 获取 SAXParserFactory 实例 public static SAXParserFactory newInstance() { return FactoryFinder.find(SAXParserFactory.class, "org.apache.xerces.jaxp.SAXParserFactoryImpl"); } }(2)具体工厂类:SAXParserFactoryImpl
package org.apache.xerces.jaxp; public class SAXParserFactoryImpl extends SAXParserFactory { @Override public SAXParser newSAXParser() throws ParserConfigurationException, SAXException { return new SAXParserImpl(); } }(3)客户端使用
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SAXParserExample { public static void main(String[] args) { try { // 获取 SAXParserFactory 实例(抽象工厂) SAXParserFactory factory = SAXParserFactory.newInstance(); // 使用工厂创建 SAXParser(具体产品) SAXParser parser = factory.newSAXParser(); // 使用 SAXParser 解析 XML 文档 // 示例代码忽略了具体 XML 文件的解析逻辑 System.out.println("SAXParser created successfully!"); } catch (Exception e) { e.printStackTrace(); } } }3、这些应用解决了什么问题?