抽象工厂模式之间的关系可用下图来解释,一个超级工厂下有多个子工厂,每个子工厂能生产不同的产品,但产品之间又属于不同的产品族
下面举一个例子,我们用代码来实现一个工厂模式
有手机和路由器两个产品等级,有华为和小米两个产品族,通过抽象工厂模式可以创建同时生产手机和路由器的工厂,一个是小米工厂生产小米手机和小米路由器,另一个是华为工厂生产华为手机和华为路由器。
- 创建手机和路由器两个接口
- 创建华为手机和小米手机两个实体类实现手机接口
- 创建华为路由器和小米路由器两个实体类实现路由器接口
- 创建抽象工厂接口,定义两个返回类型为手机接口和路由器接口的方法
- 创建小米工厂类实现抽象工厂接口,在覆盖的两个方法体内分别返回新创建的小米手机类和小米路由器类
- 创建华为工厂类实现抽象工厂接口,在覆盖的两个方法体内分别返回新创建的华为手机类和华为路由器类
- 在测试类里创建小米和华为工厂去制造其品牌的手机和路由器
手机产品接口:
public interface PhoneProduct {
void open(); //开机
void shutdown(); //关机
void call(); //打电话
}
华为手机实现类:
public class HuaweiPhone implements PhoneProduct {
@Override
public void open() {
System.out.println("华为手机开机");
}
@Override
public void shutdown() {
System.out.println("华为手机关机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
小米手机实现类:
public class XiaomiPhone implements PhoneProduct {
@Override
public void open() {
System.out.println("小米手机开机");
}
@Override
public void shutdown() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
路由器产品接口:
public interface RouterProduct {
void open(); //开机
void shutdown(); //关机
void setWifi(); //设置WiFi
}
华为路由器实现类:
public class HuaweiRouter implements RouterProduct{
@Override
public void open() {
System.out.println("小米路由器开机");
}
@Override
public void shutdown() {
System.out.println("小米路由器关机");
}
@Override
public void setWifi() {
System.out.println("小米路路由器设置WiFi");
}
}
小米路由器实现类:
public class XiaomiRouter implements RouterProduct{
@Override
public void open() {
System.out.println("小米路由器开机");
}
@Override
public void shutdown() {
System.out.println("小米路由器关机");
}
@Override
public void setWifi() {
System.out.println("小米路路由器设置WiFi");
}
}
工厂接口:
public interface ProductFactory {
PhoneProduct phoneProduct(); //手机工厂
RouterProduct routerProduct(); //路由器工厂
}
华为工厂实现类:
public class HuaweiFactory implements ProductFactory {
@Override
public PhoneProduct phoneProduct() {
return new HuaweiPhone();
}
@Override
public RouterProduct routerProduct() {
return new HuaweiRouter();
}
}
小米工厂实现类:
public class XiaomiFactory implements ProductFactory {
@Override
public PhoneProduct phoneProduct() {
return new XiaomiPhone();
}
@Override
public RouterProduct routerProduct() {
return new XiaomiRouter();
}
}
测试类:
public class Client {
public static void main(String[] args) {
System.out.println("***********小米系列产品***********");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
PhoneProduct phoneProduct = xiaomiFactory.phoneProduct();
phoneProduct.open();
phoneProduct.call();
phoneProduct.shutdown();
RouterProduct routerProduct = xiaomiFactory.routerProduct();
routerProduct.open();
routerProduct.setWifi();
routerProduct.shutdown();
System.out.println("***********华为系列产品***********");
HuaweiFactory huaweiFactory = new HuaweiFactory();
PhoneProduct phoneProduct1 = huaweiFactory.phoneProduct();
phoneProduct1.open();
phoneProduct1.call();
phoneProduct1.shutdown();
RouterProduct routerProduct1 = huaweiFactory.routerProduct();
routerProduct1.open();
routerProduct1.setWifi();
routerProduct1.shutdown();
}
}
测试结果: