java设计模式之抽象工厂模式

1.定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

2.意识图

  

 

3.示意代码

各个电脑生产商生产的电脑的CPU和显卡都不太一样

1).cpu接口

/**
 * CPU接口
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public interface CPU {
    /**
     * cpu具有计算能力
     */
    public void calculate();
}

 

2).cpu实现类-->AMD

/**
 *amd a8的cpu
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class AMDCpuA8 implements CPU {

    @Override
    public void calculate() {
        System.out.println("this is amd a8 calculate");
    }
    
}

 

3).cpu实现类-->Inter

/**
 * inter i5的cpu
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class InterCpui5 implements CPU {

    @Override
    public void calculate() {
        System.out.println("this is inter i5 calculate");
    }
    
}

 

 4).显卡接口

/**
 * 显卡
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public interface VC {
    /**
     * 显卡具有转换的功能
     */
    public void transform();
}

5).显卡实现类-->AMD

/**
 * AMD a8的 显卡
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class AMDVCA8 implements VC {

    @Override
    public void transform() {
        System.out.println("this is a8 transform");
    }

}

6).显卡实现类-->Inter

/**
 * inter i5 的集显
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class InterVCi5 implements VC {

    @Override
    public void transform() {
        System.out.println("this is i5 transform");
    }

}

 

7).PC抽象工厂类

/**
 * 抽象PC类
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public abstract class PCAbstractFactoy {
    //构建CPU
    public abstract CPU buildCPU();
    //构建video card
    public abstract VC buildVC();
}

 

 8).Dell工厂类

/**
 * 戴尔工厂类
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class DellFactory extends PCAbstractFactoy {

    @Override
    public CPU buildCPU() {
        return new AMDCpuA8();
    }

    @Override
    public VC buildVC() {
        return new AMDVCA8();
    }

}

 

 9).Lenovo工厂类

/**
 * 联想工厂
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class LenovoFactory extends PCAbstractFactoy {

    @Override
    public CPU buildCPU() {
        return new InterCpui5();
    }

    @Override
    public VC buildVC() {
        return new InterVCi5();
    }
}

10).客户端类

/**
 * 客户端类
 * wuyanlin2016@163.com
 *2017年12月25日
 */
public class Client {
    public static void main(String[] args) {
        DellFactory dellFactory = new DellFactory();
        //戴尔电脑CPU
        CPU dellCpu = dellFactory.buildCPU();
        //戴尔电脑显卡
        VC dellVC = dellFactory.buildVC();
        dellCpu.calculate();
        dellVC.transform();
        
        LenovoFactory lenovoFactory = new LenovoFactory();
        //联想电脑的CPU
        CPU lenovoCpu = lenovoFactory.buildCPU();
        //联想电脑的显卡
        VC lenovoVC = lenovoFactory.buildVC();
        lenovoCpu.calculate();
        lenovoVC.transform();
    }
}

11).结果

this is amd a8 calculate
this is a8 transform
this is inter i5 calculate
this is i5 transform

 

 4.总结

何时选用?

1).只知道产品的接口,而不关心产品的实现

2).一套产品有多种实现方式,动态切换产品线

3).联合使用一系列产品接口

 

原文地址:https://www.cnblogs.com/wuyanlin/p/8111153.html