前言
本文主要讲述抽象工厂模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。
一.什么是抽象工厂模式
抽象工厂是23种设计模式中创建型模式的一种,抽象工厂是由多个工厂组合而成。
上一章小编提到的工厂模式只存在一个抽象角色,而抽象工厂是指当有多个抽象角色时使用的一种工厂模式。如果说工厂模式像是一个公司,而抽象工厂模式则是多个公司组合起来的企业。
二.生活中的抽象工厂模式
1.华为
华为手机、华为电脑是我们所熟悉的,生产手机的话咱们需要一个工厂,专门生产手机相关的配件;生产华为电脑也需要有对应的工厂,专门生产电脑相关的配件。而多个工厂生成的产品都是华为产品,整体就像是设计模式中的抽象工厂。

2.京东
京东是咱们国内电子商务领域受消费者欢迎和具有影响力的电子商务网站之一,小编有挺多电子产品都是在京东上面购买的。在线销售家电、数码通讯、电脑、家居百货等等十几种大类上万品牌数百万的产品。每一个大类模块咱们可以看做是一个工厂,而由多个大类工厂组合而成的京东就像咱们设计模式中的抽象工厂模式了。

3.中粮集团
中粮集团是咱们国内知名企业,生产很多食品相关的产品。比如说:大米、食用油、面粉、蜂蜜、坚果等等。一个集团生产如此多的产品,每个产品需要的生产环境和机械各不相同,所以需要有对应的工厂,比如生产大米的工厂,比如生产食用油的工厂,而拥有多个生产工厂组合而成的集团等同于设计模式中的抽象工厂模式。

三.抽象工厂模式的实现
接下来小编以华为的产品手机和电脑来举例,用抽象工厂模式来实现。先创建一个抽象工厂类华为类和抽象产品接口package ```language
抽象工厂
    华为企业
*/
public abstract class HuaWei {
//生产手机的工厂
public abstract Product createPhone(String type);
//生产电脑的工厂
public abstract Product createComputer(String type);
}
/*
抽象产品接口
*/
interface Product {
//返回产品的名字
String getName();
}
再创建四个具体的产品类P30手机类、P40手机类、MateBook 14电脑类和MateBook 15电脑类,都实现抽象产品接口```language
再创建四个具体的产品类P30手机类、P40手机类、MateBook 14电脑类和MateBook 15电脑类,都实现抽象产品接口
```language
package com.qianfeng.ran;
/*
 * @author:江帅
 *		具体产品类
 *      	P30手机类
 */
public class P30Phone implements Product {
    @Override
    public String getName() {
        return "P30手机";
    }
}
/*
 * @author:江帅
 *		具体产品类
 *      	P40手机类
 */
class P40Phone implements Product{
    @Override
    public String getName() {
        return "P40手机";
    }
}
/*
 * @author:江帅
 *		具体产品类
 *      	MateBook 14电脑类
 */
public class MateBook14 implements Product{
    @Override
    public String getName() {
        return "MateBook 14电脑";
    }
}
/*
 * @author:江帅
 *		具体产品类
 *      	MateBook 15电脑类
 */
public class MateBook15 implements Product{
    @Override
    public String getName() {
        return "MateBook 15电脑";
    }
}
再创建一个具体工厂类华为工厂类并继承抽象工厂类华为类实现抽象方法
package com.qianfeng.ran;
/*
 * @author:江帅
 *
 *      具体工厂
 *          继承抽象工厂实现抽象方法的实现类
 */
public class HuaWeiFactory extends HuaWei {
    /**
     * 生产手机的工厂
     * @param type 手机型号
     * @return 手机对象
     */
    @Override
    public Product createPhone(String type) {
        //根据型号创建对象的手机产品对象并返回
        if("P40".equalsIgnoreCase(type)){
            return new P40Phone();
        }else if("P30".equalsIgnoreCase(type)){
            return new P30Phone();
        }
        //不存在的型号则返回 null 对象
        return null;
    }
    /**
     * 生产电脑的工厂
     * @param type 电脑型号
     * @return 电脑对象
     */
    @Override
    public Product createComputer(String type) {
        //根据型号创建对象的电脑产品对象并返回
        if("MateBook14".equalsIgnoreCase(type)){
            return new MateBook14();
        }else if("MateBook15".equalsIgnoreCase(type)){
            return new MateBook15();
        }
        //不存在的型号则返回 null 对象
        return null;
    }
}
最后我们通过抽象工厂模式获取需要的对象
package com.qianfeng.ran;
/*
 * @author:江帅
 *
 *  客户端
 */
public class Demo {
    public static void main(String[] args) {
        //创建华为工厂对象
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
        //-------------通过工厂模式获取P40手机对象--------
        //通过华为工厂对象调用创建手机的方法并传入型号
        Product p40 = huaWeiFactory.createPhone("P40");
        //执行结果: 
        //P40手机
        System.out.println(p40.getName());
        //-------通过工厂模式获取MateBook15电脑对象-------
        //通过华为工厂对象调用创建电脑的方法并传入型号
        Product mateBook15 = huaWeiFactory.createComputer("MateBook15");
        //执行结果: 
        //MateBook 15电脑
        System.out.println(mateBook15.getName());
    }
}
四.总结
抽象工厂把具体的对象创建延迟到具体工厂子类中,把对象的创建封装起来,减少客户端与具体对象之间的依赖,降低了系统的耦合度,提高的后期的维护性。但是跟工厂模式一样,添加新的产品需要修改抽象工厂的接口,违背了开闭原则。
            
            
      
      
                  
                  
                  
                  
                  
                    
                    
                    
                    
                    
                    
                    
                    
      
        
京公网安备 11010802030320号