抽象工厂模式

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

通用场景:

客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码

提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

优点

具体产品在应用层的代码隔离,无需关心创建的细节

将一个系列的产品统一到一起创建

缺点

规定了所有可以被创建的产品集合,产品簇中扩展新的产品困难

增加了系统的抽象性和理解难度

IProductFactory接口

public interface IProductFactory {
    //生产手机
    IphoneProduct iphoneProduct();

    //生成路由器
    IRouterProduct routerProduct();
}

hauweiFactory和xiaomiFactory实现这个接口

public class HuaWeiFactory implements IProductFactory{
    @Override
    public IphoneProduct iphoneProduct() {
        return new HuaWeiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new HuaweiRouter();
    }
}

public class XiaoMiFactory implements IProductFactory {
    @Override
    public IphoneProduct iphoneProduct() {
        return new XiaoMiPhone();
    }

    @Override
    public IRouterProduct routerProduct() {
        return new XiaoMiRouter();
    }
}

IphoneProduct手机接口

public interface IphoneProduct {
    void start();
    void shutdown();
    void callUp();
    void send();

}

huawei手机和xiaomi手机都实现这个接口

public class HuaWeiPhone implements IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启华为手机");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭华为手机");
    }

    @Override
    public void callUp() {
        System.out.println("华为手机打电话");
    }

    @Override
    public void send() {
        System.out.println("华为发短信");
    }
}
public class XiaoMiPhone implements IphoneProduct{
    @Override
    public void start() {
        System.out.println("开启小米手机");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米手机");
    }

    @Override
    public void callUp() {
        System.out.println("小米手机打电话");
    }

    @Override
    public void send() {
        System.out.println("小米发短信");
    }
}

路由器接口

public interface IRouterProduct {
    void start();
    void shutdown();
    void openWifi();
    void setting();

}

xiaomi路由器和huawei路由器都实现这个接口

public class XiaoMiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("启动小米路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭小米路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("打开小米路由器wifi");
    }

    @Override
    public void setting() {
        System.out.println("小米路由器设置");
    }
}
public class HuaweiRouter implements IRouterProduct{
    @Override
    public void start() {
        System.out.println("启动华为路由器");
    }

    @Override
    public void shutdown() {
        System.out.println("关闭华为路由器");
    }

    @Override
    public void openWifi() {
        System.out.println("打开华为路由器wifi");
    }

    @Override
    public void setting() {
        System.out.println("华为路由器设置");
    }
}

测试

public class Client {
    public static void main(String[] args) {
        System.out.println("====xiaomi====== ");
        XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
        IphoneProduct iphoneProduct = xiaoMiFactory.iphoneProduct();
        IRouterProduct iRouterProduct = xiaoMiFactory.routerProduct();
        iphoneProduct.send();
        iRouterProduct.openWifi();
    }
}

如果要新增一个笔记本,需要一个笔记本接口,然后在抽象产品工厂中约束,每个厂商的工厂都要加一个实现,每个厂商都多一个笔记本类

抽象工厂模式在极其稳定的情况下很强大

image-20220925165523129

image-20220925171553812

Q.E.D.


春风亦有春风愁,不劳春风为我忧