`

设计模式学习笔记五:抽象工厂(Abstract Factory)

    博客分类:
  • .Net
阅读更多

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
    {
        IFactory 成员#region IFactory 成员

        public IUser CreateUser()
        {
            return new AccessUser();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }

        #endregion
    }
  
public class SqlFactory:IFactory
    {
        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; }
            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
    {
        IUser 成员#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
    {
        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);
    }
Code
public class AccessDepartment:IDepartment
    {
        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中可以使用反射来创建具体工厂,从而使得代码变动降到最低;在抽象工厂中需要体现出生产一系列产品。这一系列产品是相互关联,相互依赖一起使用的; 抽象工厂对应抽象产品,具体工厂对应具体产品,外部依赖抽象类型,这样对于新系列产品的创建,外部唯一依赖的就是具体工厂的创建过程(可以通过反射解决)。
        注意事项:一般来说需要创建一系列对象的时候才考虑抽象工厂;如果系统的变化点不在新系列的扩充上,那么就没有必要使用抽象工厂。
        优点: 分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中;它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变; 它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
        缺点:难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。
    
分享到:
评论

相关推荐

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    300Java设计模式部分学习笔记

    5. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。 结构型模式: 结构型模式关注于类和对象的组合。笔记中涉及了以下结构型模式: 1. 适配器模式...

    《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析

    JavaScript设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在JavaScript中,工厂模式的主要目的是通过一个公共的接口或者方法来创建对象,这样调用者无需关心对象的具体类型,只需要知道它...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    Java中的design-patterns::open_book:使用通俗易懂的案例,类图,以及配套学习笔记来详解Java的二十种设计模式!

    :hot_beverage: 用Java实现的设计模式〜 ... :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_mark:建造者模式( Builder Pattern ) :memo: , :check_mark:单例模式( S

    Java设计模式尚硅谷笔记

    3. 抽象工厂模式(Abstract Factory):为创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。 4. 建造者模式(Builder):将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示...

    设计模式学习笔记 .txt

    #### Abstract Factory(抽象工厂)模式 - **定义**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - **实现方式**:定义一个工厂接口,为不同的产品族提供多个工厂方法。 - **特点**: ...

    台湾人写的设计模式笔记

    主要分为五种:工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton)、建造者\Builder、原型\(Prototype\)。例如,工厂方法允许在子类中定义实例化对象的具体过程,而单例模式确保一个类只有一个...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **抽象工厂模式**(Abstract Factory):提供一个接口,用于创建相关或依赖对象的族,而无需指定它们具体的类。 - **建造者模式**(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...

    23种设计模式的解析与Cpp实现

    - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    23个设计模式图解--学习笔记

    2. **抽象工厂**(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 3. **建造者**(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同...

    设计模式的读书总结笔记

    1. 创建型模式:如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式关注对象的创建,旨在降低对象的创建过程与使用...

Global site tag (gtag.js) - Google Analytics