设计模式之笔记--抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory)

定义

       抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

类图

描述

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;
一个抽象工厂类,可以派生出多个具体工厂类;
每个具体工厂可以创建多个具体产品,即每个工厂可以生产一个产品集合

应用场景

      轿车是由发动机、车轮、车体结构、方向盘等部件组成的,现在要生产一辆轿车,就需要把各个部件抽象出来单独封装,再由汽车工厂来组装轿车。

 

    /// <summary>
    /// 发动机接口
    /// </summary>
    public interface IEngine
    {
        void Install();
    }

    /// <summary>
    /// 奥迪发动机
    /// </summary>
    public class AudiEngine : IEngine
    {
        public void Install()
        {
            Console.WriteLine("安装奥迪的发动机.");
        }
    }

    /// <summary>
    /// 奔驰发动机
    /// </summary>
    public class BenzEngine : IEngine
    {
        public void Install()
        {
            Console.WriteLine("安装奔驰的发动机.");
        }
    }

    /// <summary>
    /// 车轮接口
    /// </summary>
    public interface IWheel
    {
        void InstallLeftFrontWheel();
        void InstallRightFrontWheel();
        void InstallLeftBackWheel();
        void InstallRightBackWheel();
    }

    /// <summary>
    /// 奥迪车轮
    /// </summary>
    public class AudiWheel : IWheel
    {
        public void InstallLeftFrontWheel()
        {
            Console.WriteLine("安装奥迪的左前车轮.");
        }

        public void InstallRightFrontWheel()
        {
            Console.WriteLine("安装奥迪的右前车轮.");
        }

        public void InstallLeftBackWheel()
        {
            Console.WriteLine("安装奥迪的左后车轮.");
        }

        public void InstallRightBackWheel()
        {
            Console.WriteLine("安装奥迪的右后车轮.");
        }
    }

    /// <summary>
    /// 奔驰车轮
    /// </summary>
    public class BenzWheel : IWheel
    {
        public void InstallLeftFrontWheel()
        {
            Console.WriteLine("安装奔驰的左前车轮.");
        }

        public void InstallRightFrontWheel()
        {
            Console.WriteLine("安装奔驰的右前车轮.");
        }

        public void InstallLeftBackWheel()
        {
            Console.WriteLine("安装奔驰的左后车轮.");
        }

        public void InstallRightBackWheel()
        {
            Console.WriteLine("安装奔驰的右后车轮.");
        }
    }

    /// <summary>
    /// 车体结构接口
    /// </summary>
    public interface IBody
    {
        void Install();
    }

    /// <summary>
    /// 奥迪的车体结构
    /// </summary>
    public class AudiBody : IBody
    {
        public void Install()
        {
            Console.WriteLine("安装奥迪的车身结构.");
        }
    }

    /// <summary>
    /// 奔驰的车体结构
    /// </summary>
    public class BenzBody : IBody
    {
        public void Install()
        {
            Console.WriteLine("安装奔驰的车身结构.");
        }
    }

    /// <summary>
    /// 汽车工厂接口
    /// </summary>
    public interface ICarFactory
    {
        IBody CreateBody();
        IEngine CreateEngine();
        IWheel CreateWheel();
    }

    /// <summary>
    /// 具体的奥迪工厂类
    /// </summary>
    public class AudiFactory : ICarFactory
    {
        public IEngine CreateEngine()
        {
            return new AudiEngine();
        }

        public IWheel CreateWheel()
        {
            return new AudiWheel();
        }

        public IBody CreateBody()
        {
            return new AudiBody();
        }
    }

    /// <summary>
    /// 具体的奔驰工厂类
    /// </summary>
    public class BenzFactory : ICarFactory
    {
        public IEngine CreateEngine()
        {
            return new BenzEngine();
        }

        public IWheel CreateWheel()
        {
            return new BenzWheel();
        }

        public IBody CreateBody()
        {
            return new BenzBody();
        }
    }

 

posted @ 2016-03-25 10:06  sunny906  阅读(497)  评论(0编辑  收藏  举报