zoukankan      html  css  js  c++  java
  • 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).联合使用一系列产品接口

     

  • 相关阅读:
    XCOJ1250: 语言战争
    XCOJ 1249: 全自动奖学金计算系统
    杭电 2159 fate(二维背包费用问题)
    杭电 1059 Dividing
    背包问题的模版
    Shell解析器
    Shell简介
    SpringBoot配置文件占位符
    @ImportResource、@Bean
    @ImportResource注解;
  • 原文地址:https://www.cnblogs.com/wuyanlin/p/8111153.html
Copyright © 2011-2022 走看看