设计模式-创建型设计模式之抽象工厂模式

102 阅读2分钟

创建型模式-抽象工厂模式

image.png

抽象工厂模式

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

工厂方法模式(多工厂类型)类似于如下:

image.png

这个时候如果要再添加路由器,则如下:

image.png

如果再添加更多的产品则与上面两种类似,都要添加相同数量的类。

这两个图中可以提取出相同的两个抽象概念:品牌,产品类型。在抽象工厂模式中类似于同一品牌的产品称为产品族,产品类型不同称为产品等级。

image.png

抽象工厂模式:

image.png

代码实现

image.png

手机产品抽象接口

public interface IphoneProduct {  
    /**  
    * 开机  
    */  
    void start();  
    /**  
    * 关机  
    */  
    void shutdown();  
    /**  
    * 发送短信  
    */  
    void sendSms();  
    /**  
    * 打电话  
    */  
    void call();  
}

路由器产品抽象

public interface IRouterProduct {  
    /**  
    * 开机  
    */  
    void start();  
    /**  
    * 关机  
    */  
    void shutdown();  
    /**  
    * 打开wifi  
    */  
    void openWifi();  
}

华为手机产品与华为路由器产品实现

华为手机

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

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

    @Override  
    public void sendSms() {  
        System.out.println("华为手机发送短信");  
    }  

    @Override  
    public void call() {  
        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");  
    }  
}

小米手机产品与路由器产品实现

小米手机

public class XiaomiPhone implements IphoneProduct{  
    @Override  
    public void start() {  
        System.out.println("小米手机开机");  
    }  
    @Override  
    public void shutdown() {  
        System.out.println("小米手机关机");  
    }  
    @Override  
    public void sendSms() {  
        System.out.println("小米手机发送短信");  
    }  
    @Override  
    public void call() {  
        System.out.println("小米手机打电话");  
    }  
}

小米路由器

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");  
    }  
}

抽象产品工厂

public interface IProductFactory {  
    IphoneProduct createPhone();  
    IRouterProduct createRouter();  
}

华为产品工厂实现

public class HuaweiFactory implements IProductFactory{  
    @Override  
    public IphoneProduct createPhone() {  
        return new HuaweiPhone();  
    }  

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

小米产品工厂实现

public class XiaomiFactory implements IProductFactory{  
    @Override  
    public IphoneProduct createPhone() {  
        return new XiaomiPhone();  
    }  
    @Override  
    public IRouterProduct createRouter() {  
        return new XiaomiRouter();  
    }  
}

抽象工厂模式将多个系列不同等级产品交给各个系列工厂去创建,每个工厂创建各自的不同的产品。

工厂方法模式将多个系列同一等级产品交给各个工厂去创建。

抽象工厂模式

  • 增加产品需要修改抽象产品工厂,违反了开闭原则,适合产品类型稳定,不会频繁增加。
  • 适合增加产品族,只需要创建对应的工厂即可。

工厂方法模式

  • 增加产品需要增加抽象工厂类以及多个具体产品工厂类,每个具体产品工厂类负责创建产品