一、什么是工厂模式

  定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。

二、怎么使用工厂模式

  首先模拟一个场景:有一个汽车工厂,  可以日本车、美国车、中国车。。。

  这个场景怎么用工厂模式表达出来呢?

  要生产汽车所以首先要有个汽车类

 //抽象一个汽车类
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—工厂模式的更多相关文章

  1. ASP.NET四则运算--工厂模式

    这次是在ASP.NET上实现四则运算,之前用策略模式实现了,所以这次想着用工厂模式实现一下. Calculator.cs using System; using System.Collections. ...

  2. 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

    这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...

  3. ASP.NET MVC + 工厂模式 + 三层 + 缓存

    最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...

  4. Asp.Net 设计模式 之 “简单工厂”模式

    主要思想: public static Operation CreateFactory(string ope)        {            //实例化空父类,让父类指向子类         ...

  5. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  6. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

  7. ASP.NET Provider模式应用之SqlMembershipProvider类的剖析

    太多了,先给个流程图吧 Provider模式就是GOF中的两种设计模式的应用:策略模式和工厂模式,在程序中使用好这个模型能够解除模块与模块之间的耦合甚至是DIP,同时,不管是ASP.NET MVC还是 ...

  8. 代码无错就是优?简单工厂模式 C#

    还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 现在给你一道面试题,如下: 请用C++,C#,Ja ...

  9. 转:.net设计模式之工厂模式

    原文:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对 ...

随机推荐

  1. 使用一般处理程序(IHttpHandler)制作图片水印

    做网站的时候经常需要将图片加上网站名称的水印.这样做可以使别人转载图片的时候出现图片出处 ,利于网站宣传.但是如果利用ps来一个一个加水印工作量非常浩大,而且修改了之后就没法还原.这 篇教程教大家利用 ...

  2. 找峰值I II · Find Peak Element I ii

    一句话思路:找最大的元素.没有target? 一刷报错: 一定要用二分,否则复杂度不是最优. 判断条件是nums[mid] < nums[mid + 1],还是基于中位数比较的原理.不是nums ...

  3. mysql自定义函数收集

    代码: 查找字符串 in_string 中,存在多少个字符串 in_find_str delimiter $$ DROP FUNCTION IF EXISTS `fn_findCharCount` $ ...

  4. IIS文件名解析漏洞扼要分析

    概括: 从技术角度分析IIS6文件名解析漏洞的原理与IIS7的相关情况. a.IIS6错误解析文件类型现象 1.当WEB目录下,文件名以 xxx.asp;xxx.xxx 来进行命名的时候,此文件将送交 ...

  5. sql ltrim/rtrim 字段中为中文时出现?的问题

    字段存储为中文,类型为nvarchar,使用ltrim时结果集中出现的问号,我的解决办法是:将问号replace掉

  6. type="image"提交表单

    <input type="image" style="cursor:pointer; ">

  7. 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 ...

  8. 强制另存文件和加扩展名的代码c#

    强制另存为文件+扩展名的代码using System;using System.Collections.Generic;using System.Linq;using System.Web; name ...

  9. c++11多线程学习笔记之一 thread基础使用

    没啥好讲的  c++11  thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...

  10. windows10 装linux子系统

    http://blog.csdn.net/Yuxin_Liu/article/details/52347898 试了一下,下载太慢,就没继续用,可以用实验楼这个网来玩玩linux