一、大致结构
1、抽象产品类
2、抽象工厂类
3、具体工厂类
4、具体产品类
5、静态工厂类
二、代码(模拟买东西送东西的场景)
1、抽象产品类
MainProduct.java
package com.abstractfactory; public abstract class MainProduct { public abstract void setName(String name); public abstract String getName(); }
FreeProduct.java
package com.abstractfactory; public abstract class FreeProduct { public abstract void setName(String name); public abstract String getName(); }
2、抽象工厂类
AbstractFactory.java
package com.abstractfactory; public abstract class AbstractFactory { public abstract MainProduct createMainProduct(); public abstract FreeProduct createFreeProduct(); }
3、具体产品类
Computer.java
package com.abstractfactory; /** * 电脑,附赠品是鼠标垫 * @author may * */ public class Computer extends MainProduct { private String name; @Override public void setName(String name) { this.name = name; } @Override public String getName() { return this.name; } }
Mousepad.java
package com.abstractfactory; /** * 鼠标垫,电脑的附赠品 * @author may * */ public class Mousepad extends FreeProduct { private String name; @Override public void setName(String name) { this.name = name; } @Override public String getName() { return this.name; } }
Barbecue.java
package com.abstractfactory; /** * 烧烤,附赠品是水 * @author may * */ public class Barbecue extends MainProduct { private String name; @Override public void setName(String name) { this.name = name; } @Override public String getName() { return this.name; } }
Water.java
package com.abstractfactory; public class Water extends FreeProduct { //品牌名 private String name; @Override public void setName(String name) { this.name = name; } @Override public String getName() { return this.name; } }
4、具体工厂类
BarbecueFactory.java
package com.abstractfactory; /** * 买烧烤,送水 * @author may * */ public class BarbecueFactory extends AbstractFactory { @Override public MainProduct createMainProduct() { return new Barbecue() ; } @Override public FreeProduct createFreeProduct() { return new Water(); } }
ComputerFactory.java
package com.abstractfactory; /** * 买台电脑,送鼠标垫 * @author may * */ public class ComputerFactory extends AbstractFactory { @Override public MainProduct createMainProduct() { return new Computer(); } @Override public FreeProduct createFreeProduct() { return new Mousepad(); } }
5、配置文件
FactoryList.properties
ComputerFactory=com.abstractfactory.ComputerFactory
BarbecueFactory=com.abstractfactory.BarbecueFactory
6、加载配置类
PropertiesUtil.java
package com.abstractfactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Properties; public class PropertiesUtil { private static Properties props = null; static { props = new Properties(); try { props.load(PropertiesUtil.class.getResourceAsStream("/FactoryList.properties")); } catch (IOException e) { e.printStackTrace(); } } public static String getProperty(String name) { return props.getProperty(name); } public static void getFactoryList() { BufferedReader in; try { in = new BufferedReader(new InputStreamReader( PropertiesUtil.class.getResourceAsStream("/FactoryList.properties"), "utf-8")); String line = in.readLine(); while (line != null) { line = line.substring(0, line.indexOf("=")); System.out.println(line); line = in.readLine(); } } catch (IOException e) { e.printStackTrace(); } } }
7、静态工厂类
CreateFactory.java
package com.abstractfactory; public class CreateFactory { public static AbstractFactory createFactory(String name) { String className = PropertiesUtil.getProperty(name); AbstractFactory factory = null; try { factory = (AbstractFactory) Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return factory; } }
8、测试类
Customer.java
package com.abstractfactory; public class Customer { public static void main(String[] args) { AbstractFactory factory = CreateFactory.createFactory("ComputerFactory"); MainProduct mainProduct = factory.createMainProduct(); mainProduct.setName("华硕笔记本电脑"); FreeProduct freeProduct = factory.createFreeProduct(); freeProduct.setName("超级鼠标垫"); System.out.println("你购买了" + mainProduct.getName() + "附赠你" + freeProduct.getName() + "一个"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?