zoukankan      html  css  js  c++  java
  • C#设计模式:抽象工厂(Abstract Factory)

    一,抽象工厂模式 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _3._1抽象工厂
    {
    
        //如果一个工厂模式提供上衣和裤子,那么他属于工厂方法模式;
        //如果一个工厂模式提供棉袄上衣,休闲裤子,秋装上衣和西装裤子,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是不同的等级结构的产品比如棉袄上衣和秋装上衣,就是不同等级的产品结构,而X码上衣和L码上衣则是属于相同等级的产品结构
    
        //在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族,就比如棉袄上衣和秋装上衣是属于一个产品族,但是这两个是不同等级结构产品,但是产品之间有相互依赖、或作用的关系,从而组成人身上的一部分
        //抽象工厂模式所提供的一系列产品就组成一个产品族(棉袄上衣,休闲裤子,秋装上衣和西装裤子);而工厂方法提供的一系列产品称为一个等级结构(只有上衣和裤子)。
        class Program
        {
            static void Main(string[] args)
            {
                IPeopleFactory chinepeople1 = new ChinePeopleFactory();
                string Clothes1 = chinepeople1.CreateClothes().show("X码");
                string Shoes1 = chinepeople1.CreateShoes().show("32码");
                Console.WriteLine("中国人穿了" + Clothes1 + "," + Shoes1);
    
                IPeopleFactory usapeople = new USAPeopleFactory();
                string Clothes2 = usapeople.CreateClothes().show("X码");
                string Shoes2 = usapeople.CreateShoes().show("32码");
                Console.WriteLine("美国人穿了" + Clothes2 + "," + Shoes2);
    
                Console.ReadKey();
            }
        }
        public interface IClothes
        {
            string show(string type);
        }
        public interface IShoes
        {
            string show(string type);
        }
    
        public class ChineClothes : IClothes
        {
            public string show(string type)
            {
                return type + "棉袄上衣";
            }
        }
        public class ChineShoes : IShoes
        {
            public string show(string type)
            {
                return type + "休闲裤子";
            }
        }
        public class USAClothes : IClothes
        {
            public string show(string type)
            {
                return type + "秋装上衣";
            }
        }
        public class USAShoes : IShoes
        {
            public string show(string type)
            {
                return type + "西装裤子";
            }
        }
    
        public interface IPeopleFactory
        {
            IClothes CreateClothes();
            IShoes CreateShoes();
        }
        public class ChinePeopleFactory : IPeopleFactory
        {
            public IClothes CreateClothes()
            {
                return new ChineClothes();
            }
            public IShoes CreateShoes()
            {
                return new ChineShoes();
            }
        }
        public class USAPeopleFactory : IPeopleFactory
        {
            public IClothes CreateClothes()
            {
                return new USAClothes();
            }
            public IShoes CreateShoes()
            {
                return new USAShoes();
            }
        }
    }

     二,抽象工厂和工厂模式的区别:

    1,是针对的多个产品(对象)等级结构,而工厂模式是针对单个产品(对象)结构,而这些产品(对象)之间有相互依赖、或作用的关系

    三,那这里的多个产品(对象)和产品(对象)之间相互依赖关系怎么理解呢?

    1》产品(对象)理解:比如以上的代码例子,我们存在人,是需要鞋子和衣服的,而这里的鞋子和衣服属于工厂内的产品(对象)

    单个产品(对象)等级结构的理解:在工厂模式中,我们的每个人的鞋子和衣服都是相同的,所以我们的鞋子和衣服是属于单个产品(对象)等级结构

    多个产品(对象)等级结构的理解:在抽象工厂模式中,我们的每个人的鞋子和衣服都是不同的,比如有一个人需要棉袄上衣和休闲裤子,而另一个人则需要秋装上衣和西装裤子,产品(对象)等级结构出现了差异,所以是不同产品等级结构,这是就出现了多个产品(对象)等级结构,所以组成了一个产品族的概念

    PS: 当有多个不同的等级结构的产品时,如果使用工厂方法模式就势必要使用多个独立的工厂等级结构来对付这些产品的等级结构。如果这些产品等级结构是平行的,会导致多个平行的工厂等级结构。

    2》那什么是产品族?

    产品族是指上衣这样的大类,而产品则是属于产品族这一大类的,而属于这一大类的许多产品合成一个产品族,也是系列对象的组成抽象工厂模式

    3》产品(对象)之间相互依赖关系

    产品直接都是存在依赖关系,比如棉袄上衣和休闲裤子组成人的一部分

      

  • 相关阅读:
    mp4v2 基本知识
    iperf3.0 hisi uclib 交叉编译
    几个性能测试工具
    单元测试和测试驱动开发的一些常见问题总结
    线程上下文切换的性能损耗测试
    TDD中的单元测试写多少才够?
    AOP学习总结
    ATDD和TDD的区别是什么?
    [转帖]双剑合璧:CPU+GPU异构计算完全解析
    推荐《程序员的四种类型》
  • 原文地址:https://www.cnblogs.com/May-day/p/8406225.html
Copyright © 2011-2022 走看看