- 浏览: 511622 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (329)
- [发布至博客园首页] (12)
- [随笔分类][01] .Net X (59)
- [随笔分类][20] Architecture (16)
- [随笔分类][21] Developer Logs (13)
- [网站分类]Windows 7 (1)
- [随笔分类][13] Oracle & .Net (7)
- [随笔分类][16] Love in China (14)
- [随笔分类][15] Development Tools (20)
- [随笔分类][18] Windows Phone (12)
- [随笔分类][12] Design & Pattern (17)
- [网站分类].NET新手区 (22)
- [网站分类]首页候选区 (2)
- [随笔分类][08] Windows (Server) (13)
- [随笔分类][02] CSLA.Net (3)
- [随笔分类][10] jQuery & javaScript (10)
- [随笔分类][11] SQL Server (4)
- [随笔分类][22] Enterprise Logs (3)
- [随笔分类][03] News (9)
- [随笔分类][19] Quality Assurance (2)
- [随笔分类][05] Silverlight (20)
- [随笔分类][14] Google Earth & .Net (6)
- [网站分类]非技术区 (9)
- [随笔分类][07] WWF (2)
- [随笔分类][04] SharePoint (1)
- [随笔分类][20] Analysis & Design (36)
- [随笔分类][06] WCF (5)
- [随笔分类][12] Architecture (1)
- [随笔分类][09] WPF (0)
- [随笔分类][17] VStudio & Expression (5)
最新评论
-
zhangyy130:
你好,我关于第二段的那个表视图、模型与图这三者的关系我没有看明 ...
UML模型的组成 -
guji528:
谢谢分享!
Enterprise Architect 基础应用 -
studentsky:
好文章,图文并茂!
WCF 第一个用 Visual Studio 2010 创建的WCF服务 -
chen975311486:
用哪个工具画的????
UML中对关系的描述 (二) -
frankies:
继续学习中。。
UML 交互概述图
开闭原则和依赖倒置原则是面向对象设计的重点,编程是一门艺术,大批量的改动,是不好看的做法。
重点概念
1. 工厂方法模式(不是抽象工厂)是定义一个用于创建对象的接口,让子类中实现这个接口的方法中的内容决定实例化那一个类(New 什么类)。
2. 抽象工厂模式提供几个创建类的接口,具体抽象子类利用父类定义的方法创建相关的“产品抽象类型”的一组子类具体实现。
3. 从上图中可以看出,抽象工厂接口的所有子类实现中中也定义有一个工厂方法,上图有些乱,元素命名不是很容易懂,但图的结构完全正确可以结合代码去理解。
4. 上图中IFactory 是一个抽象工厂接口,他里面应该包含所有的产品(所有指AbstractProductA下面的所有子类的个数,而不是AbstractProduct抽象类的个数)创建的抽象方法。产品抽象和抽象工厂所关注的是一个横向一个纵向
5. 也就是通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应该使用不同的具体工厂。
6. 反射格式 Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”)
7. 利用反射可以使用字符串形式来实例化对象,而一般的情况实例化是写死在程序中的,将程序由编译时转为运行时。
8. 所有在用简单工厂的地方,都可以考虑用反射技术来去除Switch或If ,杰出分支判断带来的耦合。
9. 无痴迷,不成功
示例代码
上图中的源代码
using System; using System.Collections.Generic; using System.Text; namespace 抽象工厂模式 { class Program { static void Main(string[] args) { //建立具体的抽象工厂 AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); Console.Read(); } } /// <summary> /// 抽象工厂 /// </summary> abstract class AbstractFactory { //在抽象工厂中要实现那些表的特定访问方式的实例,有几个表 public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } /// <summary> /// 具体抽象工厂,抽象了访问SQLServer 方式 /// </summary> class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } /// <summary> /// Access /// </summary> class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } /// <summary> /// 产品抽象A,User表 /// </summary> abstract class AbstractProductA { } /// <summary> /// 产品抽象B 部门表 /// </summary> abstract class AbstractProductB { public abstract void Interact(AbstractProductA a); } #region ConcreteFactory1抽象工厂职能 ,比如SQL Server //实现 产品抽象A class ProductA1 : AbstractProductA { } //实现产品抽象B class ProductB1 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } #endregion #region ConcreteFactory2抽象工厂职能 ,比如Access class ProductA2 : AbstractProductA { } class ProductB2 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } #endregion /// <summary> /// 客户端程序 /// </summary> class Client { private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; // 选择哪个具体抽象工厂,也就是选择哪种数据库 public Client(AbstractFactory factory) { AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); } //展示结果 public void Run() { AbstractProductB.Interact(AbstractProductA); } } }
示例2 反射+ 简单工厂
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Configuration; namespace 抽象工厂模式 { class Program { static void Main(string[] args) { User user = new User(); Department dept = new Department(); IUser iu = DataAccess.CreateUser(); iu.Insert(user); iu.GetUser(1); IDepartment id = DataAccess.CreateDepartment(); id.Insert(dept); id.GetDepartment(1); Console.Read(); } } #region 实体层 class User { private int _id; public int ID { get { return _id; } set { _id = value; } } private string _name; public string Name { get { return _name; } set { _name = value; } } } class Department { private int _id; public int ID { get { return _id; } set { _id = value; } } private string _deptName; public string DeptName { get { return _deptName; } set { _deptName = value; } } } #endregion #region 用户表 interface IUser { void Insert(User user); User GetUser(int id); } class SqlserverUser : IUser { public void Insert(User user) { Console.WriteLine("在Sqlserver中给User表增加一条记录"); } public User GetUser(int id) { Console.WriteLine("在Sqlserver中根据ID得到User表一条记录"); return null; } } class AccessUser : IUser { public void Insert(User user) { Console.WriteLine("在Access中给User表增加一条记录"); } public User GetUser(int id) { Console.WriteLine("在Access中根据ID得到User表一条记录"); return null; } } #endregion #region 部门表 interface IDepartment { void Insert(Department department); Department GetDepartment(int id); } class SqlserverDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Sqlserver中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Sqlserver中根据ID得到Department表一条记录"); return null; } } class AccessDepartment : IDepartment { public void Insert(Department department) { Console.WriteLine("在Access中给Department表增加一条记录"); } public Department GetDepartment(int id) { Console.WriteLine("在Access中根据ID得到Department表一条记录"); return null; } } #endregion /// <summary> /// 简单工厂反射 /// </summary> class DataAccess { private static readonly string AssemblyName = "抽象工厂模式"; private static readonly string db = ConfigurationManager.AppSettings["DB"]; //利用反射代替Switch 语句的判断,进行运行时实例化 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); } } }
发表评论
-
享元模式(Flyweight)
2009-12-13 19:26 797重点概念 1. 这个模式相对简单。享元模式,就是在工厂 ... -
理解软件外包的种类
2009-12-17 21:11 578包项目 包人 包时间 -
解释器模式(Interpreter)
2009-12-20 14:02 647重要概念 1. 给定一个语言,定义它的文法的一种表示,并定义 ... -
访问者模式(Visitor)
2009-12-20 16:13 771重点概念 1. 双分派:得到执行的操作决定于请求的种类和接收 ... -
观察者(发布订阅)模式 与 委托事件
2009-12-02 17:07 1027多一些宽容 重点概念 1. 开放封闭原则,修改原有代码就说 ... -
状态模式(State)
2009-12-03 17:53 701重点概念 1. 方法内容如果过长其实就有可能出了问题。 2. ... -
适配器模式(Adapter)
2009-12-03 22:59 742适配器模式比较简单常 ... -
备忘录模式(Memento)
2009-12-06 10:59 750重点概念 1. 希望把存取状态的细节封装起来,而且最好是封装 ... -
组合模式(Composite)
2009-12-06 15:39 632重要概念 1. 将对象组合成树形结构以表示‘部分-整体’的层 ... -
迭代器模式(Iterator)
2009-12-06 16:48 939C# 中已经实现了迭代器功能, foreach in 和 IE ... -
单例模式(Singleton)
2009-12-06 19:55 810重点概念 1. 所有类都有构造方法,不编码则系统默认生成空的 ... -
大型网站性能优化的通用方法
2009-12-10 12:56 7891、HTML静态化其实大家 ... -
桥接模式(Bridge)与合成/聚合复用原则(CARP)
2009-12-13 12:40 1073重要概念 1.合成/聚合 ... -
命令模式(Command)
2009-12-13 14:16 776重要概念 1.命令抽象类,也是命令模式的核心理解 2. ... -
职责链模式(Chain of Responsibility)
2009-12-13 16:13 1111重要概念 1. 使多个对象都有机会处理请求,从而避免请求的发 ... -
依赖倒转(依赖倒置)原则
2009-11-30 15:23 7961. 抽象不应该依赖细节,细节应该依赖于抽象(接口,抽象类)。 ... -
装饰模式(Decorator)
2009-11-30 18:32 798重点概念 1. 把所需的功能按正确的顺序串联起来进行控制。 ... -
代理模式(Proxy)
2009-11-30 21:55 742大话设计模式讲的和连环画一样,还可以接上,作者真用心,看起来很 ... -
工厂方法模式(Factory Method)
2009-12-01 10:57 928重要概念 本章内容围绕简单工厂与工厂方法的比较很好的说明了工 ... -
原型模式(Prototype)
2009-12-01 12:53 743重要概念回顾 1. 原型 ...
相关推荐
【清华大学】DeepSeek从入门到精通(视频课程+PDF)
自2019年以来,教育部启动实施“双高计划”,遴选确定首批“双高计划”建设单位197所,其中高水平学校建设单位56所,高水平专业群建设单位141所,河南省有黄河水利职业技术学院、河南工业职业技术学院等6所职业学校入选。2022年,教育部开展国家“双高计划”中期绩效评价,从评价结果看,国家“双高计划”任务进展顺利,建设成效突出,形成了一批先进经验做法和典型案例,在引领职业教育改革、服务国家战略和支撑区域发展方面形成示范势头。 今天,我们给大家分享一些“双高计划”专业群完整申报书与建设方案和中期评估报告。 ## 一、专业群完整申报书与建设方案 ## 二、“双高计划”中期报告 (100多份)
内容概要:本文详细探讨了电商平台上秒杀系统中减库存的设计逻辑和技术优化方法。首先,文中阐述了‘下单减库存’、‘付款减库存’和‘预扣库存’三种常见方式及其各自面临的问题和局限性,尤其是面对高并发流量冲击下的系统稳定性与数据准确性保障挑战。接着讨论了适用于大规模促销活动中快速而精准地扣除存货的方法,提出了诸如应用本地缓存(Local Cache)、引入高性能持久化键值存储(如Redis),甚至修改数据库引擎源代码(InnoDB 层面排队机制)等一系列先进解决方案来确保交易流程顺畅。此外,还提到了在极端情况发生(例如超卖)时如何借助补救措施挽回损失的具体实例。 适合人群:电商平台开发运维技术人员;有兴趣深入了解电商业务架构和技术优化的开发者和IT管理人员。 使用场景及目标:①帮助设计师理解不同减库存策略的应用时机及其利弊;②指导程序员针对特定业务需求选择最适合的技术路径进行项目构建;③提供给运维专家关于改善在线交易平台响应速度和服务质量的专业见解。 其他说明:本篇文章对于构建高效的电子商贸系统有着极高的参考价值,尤其是那些准备应对瞬息万变市场环境下的企业来说尤为重要。它不仅限于理论探讨层面,
动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。
【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线教育系统的方案。文章介绍了微服务在线教育系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本微服务在线教育系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,课程信息管理,课程类型管理,学科管理,购买的课程管理,职业规划管理,视频点播管理,我的笔记管理,我的课程管理,消息通知管理,学习交流,试卷管理,留言板管理,试题管理,系统管理,考试管理。用户功能有个人中心,用户管理,购买的课程管理,我的笔记管理,我的课程管理,消息通知管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得微服务在线教育系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高微服务在线教育系统管理效率。 关键词:微服务在线教育系统;SSM框架;MYSQL数据库;Spring Boot
javascript 基于Javascript实现,强化学习QLearning的一个贪吃蛇实例.
python教程学习
我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行管理,具有非常明显的优点,利用网络的优势特开发了本基于Spring Boot的IT技术交流和分享平台。 本IT技术交流和分享平台是基于Spring Boot框架,采用Java技术,MYSQL数据库进行开发的。系统具有灵活的一体化设计方式,圆满完成了整个系统的界面设计。本系统实现了用户功能模块和管理员功能模块两大部分,通过该系统用户可以快速进行IT技术交流和分享,管理员可登录系统后台对系统进行全面管理,确保系统正常稳定的运行。系统功能齐全,符合用户IT技术交流和分享的需求。 本文主要首先介绍了课题背景、设计原则和研究内容,系统采用的相关技术及开发平台,接着对本基于Spring Boot的IT技术交流和分享平台进行系统需求分析和设计,包括系统的功能模块,数据库的设计,系统结构以及系统界面设计等,最后对进行系统测试,完成本篇论文。 关键词:IT技术交流, Spring Boot框架, Java技术,MYSQL数据库
疲劳检测yawn图片数据集
JDK7通过java-jwt验证
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
python学习资源
51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典
内容概要:本文档是由高正奇编辑的针对模式识别和机器学习(PRML)教科书的一份详细的解答手册。文档覆盖了从基本概念如误差函数求导、贝叶斯定理应用到多元高斯分布计算、Gamma函数积分及其性质等一系列复杂问题的解决方案,以及涉及线性模型分类的基础练习题、条件概率和联合概率计算等入门级习题。每一题都经过细致推导,帮助学生加深对机器学习相关概念的理解并掌握具体的数学方法。 适合人群:主要适用于正在攻读机器学习、模式识别相关课程的学生,以及从事数据科学工作的专业人士作为深入理解和实践指南。 使用场景及目标:本手册旨在辅助教学过程中遇到的具体难题解析,在研究和实践中作为参考资料进行理论验证和技术难点突破,尤其有助于准备考试或者项目实施时需要巩固知识的应用场合。 其他说明:书中题目涵盖广泛,既有直观的概率论应用,也有复杂的积分变换技巧和最优化思路展示,对于希望提高自身计算能力和解决实际问题能力的学习者非常有价值。但要注意的是,部分内容较为深奥,可能不适合初学者自学使用,最好配合课堂讲解或其他教材一起学习效果更佳。
python学习资源
RFID-MATLAB的高等数学-CH06.rar
spaceX 动力学分析
如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级,也为了更好的维护美容院信息,美容院管理系统的开发运用就显得很有必要。并且通过开发美容院管理系统,不仅可以让所学的SpringBoot框架得到实际运用,也可以掌握MySQL的使用方法,对自身编程能力也有一个检验和提升的过程。尤其是通过实践,可以对系统的开发流程加深印象,无论是前期的分析与设计,还是后期的编码测试等环节,都可以有一个深刻的了解。 美容院管理系统根据调研,确定其实现的功能主要包括美容用品管理,美容项目管理,美容部位管理,销量信息管理,订单管理,美容项目预约信息管理等功能。 借助于美容院管理系统这样的工具,让信息系统化,流程化,规范化是最终的发展结果,让其遵循实际操作流程的情况下,对美容院信息实施规范化处理,让美容院信息通过电子的方式进行保存,无论是管理人员检索美容院信息,维护美容院信息都可以便利化操作,真正缩短信息处理时间,节省人力和信息管理的成本。 关键字:美容院管理系统,SpringBoot框架,MySQL