GoF设计模式学习-抽象工厂模式

1.目的

提供一个创建一系列相关或者相互依赖的对象的接口,而无需指定他们具体的类,产品簇的实现、流水线模式的实现(同一流水线上的零件是相互依赖的、跨流水线部件无法保证零件直接的连接)。可以从抽象工厂继承出实际的工厂、实际的流水线。在这些工厂或者流水线上的部件是同一个产品的不同部分,能充分保证零件间的可连接性。

 2.整体实现

1.基于抽象类的抽象工厂的实现

//这里我们假设如下:铺了地毯的家庭,房门是木质的;铺了瓷砖的办公区域,房门是不锈钢的
    //这样就实现了,同样是一间房子,那么所需要的组件是有依赖的,相互制约
   public abstract class AbstractHomeFactory
    {
       //对于抽象工厂是使用抽象类、还是使用接口,网上很多例子都有,按照实际情况来选择
        //接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
       public abstract Door CreateDoor();
        public abstract Floor CreateFloor();
       //使用了抽象类来实现,可以添加一些公用函数的并在抽象类中实现,如果是接口的话
       //需要在相应的实现类中自己实现
        public void Describe()
        {
            Console.WriteLine(this.CreateDoor().Matrial);
            Console.WriteLine(this.CreateFloor().Matrial);
        }
       //注意【1】抽象类的抽象方法必须是public的,否则实现类无法override
    }

    public class Door
    {
        public Door(string _matrial, double _heigh)
        {
            Matrial = _matrial;
            Heigh = _heigh;
        }
        public string Matrial { get; set; }
        public double Heigh { get; set; }
    }

    public class Floor
    {
        public Floor(string _matrial)
        {
            Matrial = _matrial;
        }
        public string Matrial { get; set; }
    }
    //抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系
   // 而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”
    //一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)
    class SweetHomeFactory : AbstractHomeFactory
    {
        //实现类实现抽象类的方法,使用关键字override
        public override Door CreateDoor()
        {
            return new Door("地毯",15);
        }

        public override Floor CreateFloor()
        {
            return new Floor("优质木材");
        }
    }
    //在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
    //抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分
    //继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
    class OfficeHomeFactory : AbstractHomeFactory
    {
        public override Door CreateDoor()
        {
            return new Door("不锈钢", 10);
        }

        public override Floor CreateFloor()
        {
            return new Floor("瓷砖");
        }
    }

static void Main(string[] args)
        {
            //实例化一个 实现了的抽象类的子类
            AbstractHomeFactory facotry = new SweetHomeFactory();
            facotry.Describe();
            Console.ReadLine();
        }


2.基于接口的抽象工厂的实现

3.思考

1.抽象工厂应该通过反射(配置)来确定实现类-实例化一个抽象工厂对象的子类

2.抽象工厂里面有很多的Model(实体),如何处理部分实体是公用的,二不是只用于一条产品线,并且做到合理配置呢

3.新增产品线该怎么处理?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章