zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    我们的工厂在工厂方法模式的改进下,现在可以生产各种各样的车了,你要啥车,你只要提供你的生产线,拿到我这里,我就能给你生产。

    有一天,突然,我买的车爆胎了。这可咱办?换胎呗,但是备胎没有啊?别的太按上不能跑啊,怎么办?于是我们想到了,在生产车的时候,同样的生产一个备胎,供这个车使用。这样,即使开车的时候,爆胎了也不怕,我们换上备胎不就可以了。

    抽象工厂模式与工厂方法模式很像,不同在于:工厂方法模式只能生产一种产品,如只能产车。而抽象工厂则不同,抽象工厂能生产多种类产品,如车和备胎。备胎和车是存在关联的两个对象。因此当我们需要产生两个相关的对象时,我们可以使用抽象工厂模式。

    我们对工厂方法中提及的例子进行扩展。抽象出两个对象:车、备胎。然后定义一个工厂,这个工厂同时提供生产这两种产品的生产线的地方。假如此时我们要生产宝马车,我们要使用这个工厂,则必须提供能匹配这个工厂“车”和“备胎”的两条生产线。梳理下,也就是:

    工厂(车、备胎)<------宝马车工厂(宝马车、宝马车备胎)。通过分析,我们知道,需要生产几种产品,则需要几个抽象的接口,然后有个抽象的工厂来调用这些产品的接口,并不关心这些接口产生何种对象。然后,具体的你要生产宝马,就自己构造自己的生产线(包含造车、造备胎)。具体实现可以看一下代码(C#):

    /*
    *---------------------------------
    *| All rights reserved.
    *| author: lizhanping
    *| version:1.0
    *| File: AbstractFactory.cs
    *| Summary:
    *| Date: 2019/3/9 13:29:52
    *---------------------------------
    */
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace DesignPatternTest.AbstractFactory
    {
    //抽象工厂,为一组相关的产品族提供实例化的接口
    //本例子中就包含 车 和 备胎 两个系列的产品,不同的车需要不同的备胎
    //因此我们在工厂生产车的时候,需要一块将车生产出来
    /// <summary>
    /// 定义车的模型
    /// </summary>
    public interface ICar
    {
    void run();
    }
    /// <summary>
    /// 定义备胎的模型,备胎用于对应的车
    /// </summary>
    public interface ISpareWheel
    {
    void use();
    }

    /// <summary>
    /// 制造车的工厂
    /// 产车
    /// 产备胎
    /// </summary>
    public interface ICarFactory
    {
    ICar CreateCar();
    ISpareWheel CreateSpareWheel();
    }

    #region Benz系列
    /// <summary>
    /// 奔驰车
    /// </summary>
    public class BenzCar:ICar
    {
    public void run()
    {
    Console.WriteLine("BenzCar is running");
    }
    }
    /// <summary>
    /// 奔驰车备胎
    /// </summary>
    public class BenzCarSpareWheel:ISpareWheel
    {
    public void use()
    {
    Console.WriteLine("BenzCar Spare wheel is using");
    }
    }
    /// <summary>
    /// 奔驰车工厂
    /// </summary>
    public class BenzCarFactory : ICarFactory
    {
    public ICar CreateCar()
    {
    return new BenzCar();
    }

    public ISpareWheel CreateSpareWheel()
    {
    return new BenzCarSpareWheel();
    }
    }
    #endregion

    #region 宝马系列
    /// <summary>
    /// 宝马车
    /// </summary>
    public class BmwCar:ICar
    {
    public void run()
    {
    Console.WriteLine("BmwCar is running...");
    }
    }
    /// <summary>
    /// 宝马车备胎
    /// </summary>
    public class BmwCarSpareWheel:ISpareWheel
    {
    public void use()
    {
    Console.WriteLine("BmwCar Spare wheel is using");
    }
    }
    /// <summary>
    /// 宝马车工厂
    /// </summary>
    public class BmwCarFactory : ICarFactory
    {
    public ICar CreateCar()
    {
    return new BmwCar();
    }

    public ISpareWheel CreateSpareWheel()
    {
    return new BmwCarSpareWheel();
    }
    }
    #endregion

    }

    测试代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //using DesignPatternTest.SimpleFactory;
    using DesignPatternTest.AbstractFactory;

    namespace DesignPatternTest
    {
    class Program
    {
    static void Main(string[] args)
    {
    ICarFactory carFactory = new BmwCarFactory();
    var bmwCar = carFactory.CreateCar();
    var bmwCarSpareWheel = carFactory.CreateSpareWheel();
    bmwCar.run();
    bmwCarSpareWheel.use();
    Console.ReadKey();
    }
    }
    }

    //测试结果

  • 相关阅读:
    SAS学习经验总结分享:篇三—SAS函数
    SAS学习经验总结分享:篇二—input语句
    微信指尖海报制作流程——中秋佳节
    SAS学习经验总结分享:篇一—数据的读取
    SAS连接MYSQL的步骤及引用数据表
    动态PPT制作
    cmake实战第一篇:初试 cmake
    由浅到深理解ROS(5)- launch启动文件的理解与编写
    由浅到深理解ROS(4)
    由浅到深理解ROS(3)-命名空间
  • 原文地址:https://www.cnblogs.com/chyshx/p/10500598.html
Copyright © 2011-2022 走看看