在看抽象工厂模式之前我们先看一下工厂模式,关于简单工厂模式和工厂方法模式,可参考https://blog.csdn.net/baolingye/article/details/101179682
抽象工厂模式之间的关系可用下图来解释,一个超级工厂下有多个子工厂,每个子工厂能生产不同的产品,但产品之间又属于不同的产品族
下面举一个例子,我们用代码来实现一个工厂模式
代码实现
手机产品接口:
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();
}
}
测试结果: