23种设计模式之抽象工厂模式
1.简介
- 抽象工厂模式只需要提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。
- 将工厂抽象成两层,抽象工厂和具体实现的工厂子类。这样可以根据对象类型使用对象的工厂子类。
- 抽象工厂模式就是对简单工厂模式的改进(进一步抽象)。
- 围绕一个超级工厂创建其他工厂,该超级工厂又被称为其他工厂的工厂。
2.适用场景
- 客户端不依赖于产品类实例创建、实现(产品是抽象的)
- 强调一系列相关的产品对象,创建对象需要使用大量的重复代码
- 提供一个产品类的库,所有产品以同样的接口出现
3.代码实现
1.定义产品接口
//手机产品接口
public interface PhoneProduct {
void startup();
void shutdown();
void call();
void sendmail();
}
//路由器产品接口
public interface RouterProduct {
void startup();
void shutdown();
void openwifi();
void settings();
}
2.创建产品接口的实现类
//小米手机
public class XiaoMiPhone implements PhoneProduct {
@Override
public void startup() {
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
System.out.println("关闭小米手机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
@Override
public void sendmail() {
System.out.println("小米手机发邮件");
}
}
//小米路由器
public class XiaoMiRouter implements RouterProduct {
@Override
public void startup() {
System.out.println("开启小米路由器");
}
@Override
public void shutdown() {
System.out.println("关闭小米路由器");
}
@Override
public void openwifi() {
System.out.println("开启小米路由器WiFi");
}
@Override
public void settings() {
System.out.println("开启小米路由器设置");
}
}
//索尼手机
public class SonyPhone implements PhoneProduct {
@Override
public void startup() {
System.out.println("开启索尼手机");
}
@Override
public void shutdown() {
System.out.println("关闭索尼手机");
}
@Override
public void call() {
System.out.println("索尼手机打电话");
}
@Override
public void sendmail() {
System.out.println("索尼手机发邮件");
}
}
//索尼路由器
public class SonyRouter implements RouterProduct {
@Override
public void startup() {
System.out.println("开启索尼路由器");
}
@Override
public void shutdown() {
System.out.println("关闭索尼路由器");
}
@Override
public void openwifi() {
System.out.println("开启索尼路由器WiFi");
}
@Override
public void settings() {
System.out.println("开启索尼路由器设置");
}
}
3.定义产品的抽象工厂接口
//抽象产品工厂
public interface ProductFactory {
//生产手机
PhoneProduct phoneProduct();
//生产路由器
RouterProduct routerProduct();
}
4.抽象抽象产品工厂的实现类
//索尼工厂
public class SonyFactory implements ProductFactory
{
@Override
public PhoneProduct phoneProduct() {
return new SonyPhone();
}
@Override
public RouterProduct routerProduct() {
return new SonyRouter();
}
}
//小米工厂
public class XiaoMiFactory implements ProductFactory
{
@Override
public PhoneProduct phoneProduct() {
return new XiaoMiPhone();
}
@Override
public RouterProduct routerProduct() {
return new XiaoMiRouter();
}
}
5.测试
//测试
public class Client {
public static void main(String[] args) {
System.out.println("========索尼系列产品========");
//索尼工厂
SonyFactory sonyFactory = new SonyFactory();
PhoneProduct phoneProduct = sonyFactory.phoneProduct();
phoneProduct.call();
phoneProduct.sendmail();
RouterProduct routerProduct = sonyFactory.routerProduct();
routerProduct.openwifi();
routerProduct.settings();
System.out.println("========小米系列产品========");
//小米工厂
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
PhoneProduct phoneProduct2 = xiaoMiFactory.phoneProduct();
phoneProduct2.call();
phoneProduct2.sendmail();
RouterProduct routerProduct2 = xiaoMiFactory.routerProduct();
routerProduct2.openwifi();
routerProduct2.settings();
}
}
4. 优点
- 将一个系列的产品统一创建
- 具体产品在应用层的代码隔离
5.缺点
- 规定了所有可能被创建的产品集合,扩展新的产品困难度加大
- 增加了系统的抽象性和理解难度