asp.net—工厂模式
一、什么是工厂模式
定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
二、怎么使用工厂模式
首先模拟一个场景:有一个汽车工厂, 可以日本车、美国车、中国车。。。
这个场景怎么用工厂模式表达出来呢?
要生产汽车所以首先要有个汽车类
//抽象一个汽车类
public abstract class CarBreed
{
public string Name {get;set;}
} public class JapanCar : CarBreed
{
public JapanCar(){
Console.WriteLine("日本车");
}
}
public class ChineseCar : CarBreed
{
public ChineseCar(){
Console.WriteLine("中国车");
}
}
public class USACar : CarBreed
{
public USACar(){
Console.WriteLine("美国车");
}
}
首先用简单工厂模式:(缺点:工厂类集中了所有产品创建逻辑,不利于扩展)
//汽车工厂(简单工厂)
public class CarFactory
{
public static CarBreed getCarBreed(string car)
{
switch(car)
{
case "JapanCar":return new JapanCar();
case "ChineseCar":return new ChineseCar();
case "USACar":return new USACar();
}
}
}
//程序入口
public class Program
{
public static void Main(string[] args)
{
// 日本车
CarBreed mycar = CarFactory.getCarBreed("JapanCar");
//中国车
mycar = CarFactory.getCarBreed("ChineseCar");
//美国车
mycar = CarFactory.getCarBreed("USACar");
Console.ReadLine();
}
}
然后用工厂模式:
//汽车工厂(工厂模式)
public abstract class CarFactory
{
public abstract CarBreed getCarBreed();
}
//日本车工厂
public class JapanCarFactory : CarFactory
{
public override CarBreed getCarBreed()
{
return new JapanCar();
}
}
//中国车工厂
public class ChineseCarFactory : CarFactory
{
public override CarBreed getCarBreed()
{
return new ChineseCar();
}
}
//美国车工厂
public class USACarFactory : CarFactory
{
public override CarBreed getCarBreed()
{
return new USACar();
}
}
//程序入口
public class Program
{
public static void Main(string[] args)
{
// 初始化工厂
CarFactory Factory = new JapanCarFactory();
//日本车
CarBreed mycar = Factory.getCarBreed();
//中国车
Factory = new ChineseCarFactory();
mycar = Factory.getCarBreed();
//。。。。。。。
Console.ReadLine();
}
}
还有一种抽象工厂模式,这个比较复杂暂时还没研究透彻这里就不做阐述
三、为什么要用工厂模式
优势1:一般在代码中,实例化一个类A是直接new A(),假如类A是一个完全独立的类,没有相似类,则没有必要使用工厂模式。但是如果类A本身有一个相似类B,而在实际使用类A或者类B的实例时,如果关心的是类A与类B的共同部分,则工厂模式就可以体现出它的优势。
优势2:初始化封装。在需求一个类的实例时,假如需要一个相同属性的实例,每次初始化的操作是一样的,用工厂模式可以对初始化进行封装,简化操作。
四、工厂模式使用场景
(1)客户端不需要知道它所创建的对象的类。例子中我们不知道每个图片加载器具体叫什么名,只知道创建它的工厂名就完成了床架过程。
(2)客户端可以通过子类来指定创建对应的对象。
asp.net—工厂模式的更多相关文章
- ASP.NET四则运算--工厂模式
这次是在ASP.NET上实现四则运算,之前用策略模式实现了,所以这次想着用工厂模式实现一下. Calculator.cs using System; using System.Collections. ...
- 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...
- ASP.NET MVC + 工厂模式 + 三层 + 缓存
最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...
- Asp.Net 设计模式 之 “简单工厂”模式
主要思想: public static Operation CreateFactory(string ope) { //实例化空父类,让父类指向子类 ...
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- ASP.NET Provider模式应用之SqlMembershipProvider类的剖析
太多了,先给个流程图吧 Provider模式就是GOF中的两种设计模式的应用:策略模式和工厂模式,在程序中使用好这个模型能够解除模块与模块之间的耦合甚至是DIP,同时,不管是ASP.NET MVC还是 ...
- 代码无错就是优?简单工厂模式 C#
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 现在给你一道面试题,如下: 请用C++,C#,Ja ...
- 转:.net设计模式之工厂模式
原文:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对 ...
随机推荐
- 使用一般处理程序(IHttpHandler)制作图片水印
做网站的时候经常需要将图片加上网站名称的水印.这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传.但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原.这 篇教程教大家利用 ...
- 找峰值I II · Find Peak Element I ii
一句话思路:找最大的元素.没有target? 一刷报错: 一定要用二分,否则复杂度不是最优. 判断条件是nums[mid] < nums[mid + 1],还是基于中位数比较的原理.不是nums ...
- mysql自定义函数收集
代码: 查找字符串 in_string 中,存在多少个字符串 in_find_str delimiter $$ DROP FUNCTION IF EXISTS `fn_findCharCount` $ ...
- IIS文件名解析漏洞扼要分析
概括: 从技术角度分析IIS6文件名解析漏洞的原理与IIS7的相关情况. a.IIS6错误解析文件类型现象 1.当WEB目录下,文件名以 xxx.asp;xxx.xxx 来进行命名的时候,此文件将送交 ...
- sql ltrim/rtrim 字段中为中文时出现?的问题
字段存储为中文,类型为nvarchar,使用ltrim时结果集中出现的问号,我的解决办法是:将问号replace掉
- type="image"提交表单
<input type="image" style="cursor:pointer; ">
- How to Set Up an Rsync Daemon on Your Linux Server
Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...
- 强制另存文件和加扩展名的代码c#
强制另存为文件+扩展名的代码using System;using System.Collections.Generic;using System.Linq;using System.Web; name ...
- c++11多线程学习笔记之一 thread基础使用
没啥好讲的 c++11 thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...
- windows10 装linux子系统
http://blog.csdn.net/Yuxin_Liu/article/details/52347898 试了一下,下载太慢,就没继续用,可以用实验楼这个网来玩玩linux