抽象工厂设计模式
2025-06-21
1.问题背景:
现在有两个产品(Product)分别是手机壳(PhoneCase)和耳机(EarPhone),但是他们会来自于各个生产厂商,比如说Apple和Android等等
那么至少会有四个产品,分别是安卓手机壳,安卓耳机,苹果手机壳,苹果耳机。
但是安卓手机壳和安卓耳机都是安卓体系,所以想到采用工厂方式,一个工厂一起就把这两个类创建了
那用户至少会有两个体系,安卓和苹果,如果说用户说安卓体系就用安卓的工厂去创建,苹果体系就用苹果的工厂去创建
那么问题来了,两个体系倒还好,那万一后面还多了,鸿蒙系统、linux、mac之类的系统,肯定是不可能通过if、 else if去选择创建产品的工厂
迎面而来的解决方法就是通过抽象工厂,这也就是抽象工厂设计模式
2.介绍抽象工厂
一个体系下有两个产品,这两个产品我们可以用工厂一次创建,关键问题是体系太多不好定义,所以我们可以抽象一个工厂,然后不同体系基于该工厂去实现,去定义自己的创建产品的逻辑
但是这样又有一个问题,工厂生产出来的类至少有两个,所以我们需要一个Client类,来接受工厂生成出来的产品类(手机壳和耳机),并且管理每个类的具体方法
3.手搓代码环节
3.1项目结构
3.2product
耳机的通用方法
package product; public interface EarPhone { public void useEarphone(); }
手机壳的通用方法
package product; public interface PhoneCase { public void protectPhone(); }
苹果耳机的具体实现
package product; public class AppleEarphone implements EarPhone{ @Override public void useEarphone() { System.out.println("使用苹果耳机"); } }
苹果手机壳的具体实现
package product; public class ApplePhoneCase implements PhoneCase{ @Override public void protectPhone() { System.out.println("保护苹果手机"); } }
安卓耳机的具体实现
package product; public class AndroidEarphone implements EarPhone{ @Override public void useEarphone() { System.out.println("使用安卓耳机"); } }
安卓手机壳的具体实现
package product; public class AndroidPhoneCase implements PhoneCase { @Override public void protectPhone() { System.out.println("保护安卓手机"); } }
3.3sysfactory
通用工厂接口,因为每个工厂都需要创建对应的耳机类和手机壳类
package sysfactory; import product.EarPhone; import product.PhoneCase; public interface AccessoryFactory { public PhoneCase createPhoneCase(); public EarPhone createEarphone(); }
苹果工厂实现
package sysfactory; import product.AppleEarphone; import product.ApplePhoneCase; import product.EarPhone; import product.PhoneCase; public class AppleAccessoryFactory implements AccessoryFactory{ @Override public PhoneCase createPhoneCase() { return new ApplePhoneCase(); } @Override public EarPhone createEarphone() { return new AppleEarphone(); } }
安卓工厂实现
package sysfactory; import product.AndroidEarphone; import product.AndroidPhoneCase; import product.EarPhone; import product.PhoneCase; public class AndroidAccessoryFactory implements AccessoryFactory { @Override public PhoneCase createPhoneCase() { return new AndroidPhoneCase(); } @Override public EarPhone createEarphone() { return new AndroidEarphone(); } }
3.4client
package client; import product.EarPhone; import product.PhoneCase; import sysfactory.AccessoryFactory; public class Client { private final PhoneCase phoneCase; private final EarPhone earphone; public Client(AccessoryFactory factory) { this.phoneCase = factory.createPhoneCase(); this.earphone = factory.createEarphone(); } public void useAccessories() { phoneCase.protectPhone(); earphone.useEarphone(); } }
3.5主类
package app; import client.Client; import sysfactory.AccessoryFactory; import sysfactory.AndroidAccessoryFactory; import sysfactory.AppleAccessoryFactory; public class Main { public static void main(String[] args) { AccessoryFactory appleFactory = new AppleAccessoryFactory(); Client appleClient = new Client(appleFactory); appleClient.useAccessories(); AccessoryFactory androidFactory = new AndroidAccessoryFactory(); Client androidClient = new Client(androidFactory); androidClient.useAccessories(); Client appleClient1 = new Client(new AppleAccessoryFactory()); appleClient1.useAccessories(); } }
发表评论: