设计模式-抽象工厂(Abstract Factory)

设计模式-抽象工厂(Abstract Factory),第1张

概述  1.概述      意图:          提供一个创建一系列相关或相互依赖的对象的接口,而无需指定其具体的类。     使用场合:         在以下场合可以使用抽象工厂:         (1).一个系统要独立于其产品的创建、组合和表示时;         (2).一个系统要有多个产品系列中的一个来配置时         (3).需要提供一个产品类库,而只想显示他们的接口,而影藏其实   1.概述 
    意图:
         提供一个创建一系列相关或相互依赖的对象的接口,而无需指定其具体的类。
    使用场合:
        在以下场合可以使用抽象工厂:
        (1).一个系统要独立于其产品的创建、组合和表示时;
        (2).一个系统要有多个产品系列中的一个来配置时
        (3).需要提供一个产品类库,而只想显示他们的接口,而影藏其实现时。
    抽象工厂结构:

        (1).AbstractFactory:声明一个创建抽象产品对象的接口。
        (2).CreateFactory:实现创建具体产品对象的 *** 作。
        (3).AbstractProduct:为一类产品对象声明接口。
        (4).CreateProduct:定义一个将被相应具体工厂创建的产品对象,以实现AbstractProduct接口。
        (5).仅使用AbstractFactory和AbstractProduct类声明的接口。
     2.实例
    大话设计模式中的用了抽象工厂模式的数据访问,结构图:


抽象工厂:


public interface IFactory

    {

        IUser createuser();

        IDepartment CreateDepartment();

    } 具体工厂:


public class AccessFactory:IFactory

    {

        #region IFactory 成员


        public IUser createuser()

        {

            return new AccessUser();

        }


        public IDepartment CreateDepartment()

        {

            return new AccessDepartment();

        }


        #endregion

    }


public class sqlFactory:IFactory

    {

        #region IFactory 成员


        public IUser createuser()

        {

            return new sqlUser();

        }


        public IDepartment CreateDepartment()

        {

            return new sqlDepartment();

        }


        #endregion

    } 实体类:


public class UserInfo

    {

        private int userID;

        private string name;


        public int UserID

        {

            get { return userID; }

@H_502_256@

            set { userID = value; }

        }


        public string name

        {

            get { return name; }

            set { name = value; }

        }

    }


public class Department

    {

        private int departmentID;

        private string departmengname;


        public int DepartmentID

        {

            get { return departmentID; }

            set { departmentID = value; }

        }


        public string Departmentname

        {

            get { return departmengname; }

            set { departmengname = value; }

        }

    }
User:


public interface IUser

    {

        voID Insert(UserInfo UserOne);

        UserInfo GetUserOne(int UserID);

    }


public class sqlUser:IUser

    {

@H_73_419@

        #region IUser 成员


        public voID Insert(UserInfo UserOne)

        {

            Console.Writeline("在sqlServer中给User表增加一条记录");

        }


        public UserInfo GetUserOne(int UserID)

        {

            Console.Writeline("在sqlServer中根据UserID得UserInfo的一条记录");

            return null;

        }


        #endregion

    }


 public class AccessUser:IUser

    {

        #region IUser 成员


        public voID Insert(UserInfo UserOne)

        {

            Console.Writeline("在Access中给User表增加一条记录");

        }


        public UserInfo GetUserOne(int UserID)

        {

            Console.Writeline("在Access中根据UserID得UserInfo的一条记录");

            return null;

        }


        #endregion

    } Department:


    public interface IDepartment

    {

        voID InsertDepartment(Department DepartmentOne);

        Department GetDepartment(int DepartmentID);

    }


public class AccessDepartment:IDepartment

    {

        #region IDepartment 成员


        public voID InsertDepartment(Department DepartmentOne)

        {

            Console.Writeline("在Access中增加一条部门记录");

        }


        public Department GetDepartment(int DepartmentID)

        {

            Console.Writeline("根据部门编号从Access的Department中提取一条部门记录");

            return null;

        }


        #endregion

    } main:


static voID Main(string[] args)

        {

            UserInfo user = new UserInfo();

            Department dept = new Department();


            IFactory Accfactory = new sqlFactory();


            IUser iua = Accfactory.createuser();

            iua.Insert(user);

            iua.GetUserOne(1);

            IDepartment IDa = Accfactory.CreateDepartment();

            IDa.InsertDepartment(dept);

            IDa.GetDepartment(1);

            Console.Writeline("=============================================================");

            IFactory sqlfactory = new AccessFactory();


            IUser ius = sqlfactory.createuser();

            ius.Insert(user);

            ius.GetUserOne(1);

            IDepartment IDs = sqlfactory.CreateDepartment();

            IDs.InsertDepartment(dept);

            IDs.GetDepartment(1);


            Console.Readline();

        }
运行结果:


     3.总结     
         实现要点: 抽象工厂本身不负责创建产品,产品最终还是由具体工厂来创建的。比如,Iua是AccessFactory创建的,而不是IFactory创建的。在.NET中可以使用反射来创建具体工厂,从而使得代码变动降到最低;在抽象工厂中需要体现出生产一系列产品。这一系列产品是相互关联,相互依赖一起使用的; 抽象工厂对应抽象产品,具体工厂对应具体产品,外部依赖抽象类型,这样对于新系列产品的创建,外部唯一依赖的就是具体工厂的创建过程(可以通过反射解决)。
        注意事项:一般来说需要创建一系列对象的时候才考虑抽象工厂;如果系统的变化点不在新系列的扩充上,那么就没有必要使用抽象工厂。
        优点: 分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口 *** 纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中;它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变; 它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。

        缺点:难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。


转载自:http://www.cnblogs.com/peIDa/archive/2008/06/10/1216141.HTML

总结

以上是内存溢出为你收集整理的设计模式-抽象工厂(Abstract Factory)全部内容,希望文章能够帮你解决设计模式-抽象工厂(Abstract Factory)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/sjk/1179821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存