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();
    }
    }
    }

    //测试结果

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/chyshx/p/10500598.html
Copyright © 2011-2022 走看看