《大话设计模式》学习笔记11:抽象工厂模式

  

切换数据库类型示例:

  

1.User类:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

2.AbstractProduct(以User为例):

    public interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }

3.Product(以User、SQL Server为例):

    public class SqlserverUser:IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在SQL Server中给User表增加一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在SQL Server中根据Id得到User表中的一条记录");
            return null;
        }
    }

4.AbstractFactory:

    public interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }

5.ConcreteFactory(以SQL Server为例):

    public class SqlserverFactory:IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    }

6.客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            IFactory factory = new SqlserverFactory();
            IUser user = factory.CreateUser();
            user.Insert(new User());
            user.GetUser(1);
        }
    }

用简单工厂来改进抽象工厂:

  

1.DataAccess:

    public class DataAccess
    {
        private static readonly string db = "Sqlserver";
        //private static readonly string db = "Access";
        public static IUser CreateUser()
        {
            IUser user;
            switch (db)
            {
                case "Sqlserver":
                    user = new SqlserverUser();
                    break;
                case "Access":
                    user = new AccessUser();
                    break;
            }
            return user;
        }

        public static IDepartment CreateDepartment()
        {
            IDepartment department;
            switch (db)
            {
                case "Sqlserver":
                    department = new SqlserverDepartment();
                    break;
                case "Access":
                    department = new AccessDepartment();
                    break;
            }
            return department;
        }
    }

2.客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            IUser user = DataAccess.CreateUser();
            user.Insert(new User());
            user.GetUser(1);
        }
    }

反射+抽象工厂:

DataAccess:

using System.Reflection;
    public class DataAccess
    {
        private static readonly string AssemblyName = "AbstractFactory";//程序集名称
        private static readonly string db = "Sqlserver";//数据库类型
        public static IUser CreateUser()
        {
            string className = AssemblyName + "." + db + "User";
            return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
        }

        public static IDepartment CreateDepartment()
        {
            string className = AssemblyName + "." + db + "Department";
            return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
        }
    }

反射+配置文件:

1.配置文件:

<configuration>
  <appSettings>
    <add key="DB" value="Sqlserver"/>
  </appSettings>
</configuration>

2.DataAccess:

using System.Configuration; 
    public class DataAccess
    {
        private static readonly string AssemblyName = "AbstractFactory";//程序集名称
        private static readonly string db = ConfigurationManager.AppSettings["DB"];
        public static IUser CreateUser()
        {
            string className = AssemblyName + "." + db + "User";
            return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
        }

        public static IDepartment CreateDepartment()
        {
            string className = AssemblyName + "." + db + "Department";
            return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
        }
    }
时间: 2024-10-13 10:54:20

《大话设计模式》学习笔记11:抽象工厂模式的相关文章

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

菜鸟学设计模式系列笔记之抽象工厂模式

抽象工厂模式(Abstract Factory模式): (1)Intent:提供一个创建一系列相关后相互依赖对象的接口,而无需指定它们具体的类-客户端不必指定产品的具体类型,创建多个产品族中的产品对象 (2)Motivation :为保证视感风格标准间的可移植性,应用不应该为一个特定的视感外观硬编码它的窗口组件.在整个应用中实例化特定的视感风格的窗口组建类将使得使得以后很难改变视感的风格. 抽闲工厂模式面对的是多个产品等级结构的系统设计. 工厂方法模式针对的是一个产品等级结构: 抽象工厂模式需要

大话设计模式读书笔记--1.简单工厂模式

定义 专门定义一个类来负责创建其他类的实例, 被创建的类通常具有共同的父类. 它又称为静态工厂模式,属于类的创建型模式 模式类图 将对象的创建和对象本身业务处理分离了,可以降低系统的耦合 工厂模式实现 场景:实现一个计算器, 输入a和b, 计算a+b和a-b 下载代码,解压后目录如下图: 优缺点 当增加一个乘法运算时,需要添加乘法类和修改工厂类创建对象的逻辑,它违反了开闭原则 优点:提供专门的工程类创建对象, 降低系统的耦合 缺点: 添加新产品时,需要修改工厂类, 系统扩展困难 使用场景 1.客

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂

设计模式(三)——抽象工厂模式

设计模式(三)--抽象工厂模式 一.抽象工厂模式 1.抽象工厂模式简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. UML类图: 2.抽象工厂模式角色 (1)抽象工厂AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现 (2)具体工厂:包括具体工厂FactoryM和具体工厂FactoryN.具体工厂FactoryM用于生产具体产品MProductA和具体产品M

设计模式笔记10: 抽象工厂模式

1.1 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 1.2 类图 1.3 代码实现 1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Linq; 5 using System.Reflection; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 names

设计模式那点事读书笔记(2)----抽象工厂模式

抽象工厂模式: 此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 解决什么问题: 抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 抽象产品 */ public abstract class AbstractBa