抽象工厂模式实例(C#)

抽象工厂的具体实例:

 

用Factory Method模式设计一个电视机工厂:

要求为每种品牌的电视机提供一个子工厂,如:海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。

类图:


说明:此类图由Visual studio 2012根据源码自动生成,Program可视为调用工厂的Client

由类图可见我单独为电视产品申明了一个顶层的抽象类,之后是海尔和海信各自的产品抽象类,然后具体的产品类由各自的产商自己实现。同时产品的工厂类也是由一个顶层的抽象工厂类,下面派生了两个具体的海尔工厂类和海信工厂类。

Factory类实现源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractTVFactory
{
    //抽象的TV
    abstract class AbsTVFactory
    {
        //private String Brand;
        abstract public AbsTVProduct BuildProduct();
    }

    //具体的电视品牌的抽象工厂
    class HairFactory : AbsTVFactory
    {
        //public void getBrand()
        //{
        //    //throw new NotImplementedException();
        //    Console.WriteLine("Hair Brand");
        //}
        public override AbsTVProduct BuildProduct()
        {
            //throw new NotImplementedException();
            return new HairTV1();
        }
    }

    class HisenseFactory : AbsTVFactory
    {
        public override AbsTVProduct BuildProduct()
        {
            return new HisenseTV1();
        }
    }
    abstract class AbsTVProduct
    {
        abstract public void TVProduct();
    }

    //下面是抽象的产品TV类
    abstract class AbsHairTVProduct:AbsTVProduct      //海尔的产品抽象类
    {
        abstract override public void TVProduct();
    }
    abstract class AbsHisenseTVProduct : AbsTVProduct   //海信的产品抽象类
    {
        abstract override public void TVProduct();
    }

    //具体的TV类
    class HairTV1 : AbsHairTVProduct    //海尔的TV产品1
    {
        public override void TVProduct()
        {
            Console.WriteLine("This is Hair TV Product! " + this.GetType().ToString());
        }
    }
    class HairTV2 : AbsHairTVProduct      //海尔的TV产品2
    {
        public override void TVProduct()
        {
            Console.WriteLine("This is Hair TV Product! "+this.GetType().ToString());
        }
    }

    class HisenseTV1 : AbsHisenseTVProduct
    {
        public override void TVProduct()
        {
            //throw new NotImplementedException();
            Console.WriteLine("This is Hisense TV Product! " + this.GetType().ToString());
        }
    }
    class HisenseTV2 : AbsHisenseTVProduct
    {
        public override void TVProduct()
        {
            //throw new NotImplementedException();
            Console.WriteLine("This is Hisense TV Product! " + this.GetType().ToString());
        }
    }

}
客户端运行源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractTVFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            AbsTVFactory HairTVFactory = new HairFactory();
            AbsHairTVProduct HairTV_1=new HairTV1();                  //海尔TV种类1
            HairTV_1=(AbsHairTVProduct)HairTVFactory.BuildProduct();
            HairTV_1.TVProduct();

            AbsHairTVProduct HairTV_2 = new HairTV2();                //海尔的TV种类2
            HairTV_2 = (AbsHairTVProduct)HairTVFactory.BuildProduct();
            HairTV_2.TVProduct();

            //海信的TV
            AbsTVFactory HisenseTVFactory = new HisenseFactory();
            AbsHisenseTVProduct HisenseTV_1 = new HisenseTV1();        //海信的TV种类1
            HisenseTV_1 = (AbsHisenseTVProduct)HisenseTVFactory.BuildProduct();
            HisenseTV_1.TVProduct();

            AbsHisenseTVProduct HisenseTV_2 = new HisenseTV2();        //海信的TV种类2
            HisenseTV_2 = (AbsHisenseTVProduct)HisenseTVFactory.BuildProduct();
            HisenseTV_2.TVProduct();

            Console.ReadKey();
        }
    }
}

运行截图:


直观的关系图:



原文地址:https://www.cnblogs.com/NewWork/p/3260559.html