闽公网安备 35020302035485号
/**
* 抽象产品 - 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)具体工厂类:DocumentBuilderFactoryImplpackage 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)具体工厂类:SAXParserFactoryImplpackage 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、这些应用解决了什么问题?