一、什么是工厂模式

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

二、怎么使用工厂模式

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

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

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

 //抽象一个汽车类
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. Linux下Google Test (GTest)测试环境搭建步骤

    1.下载GTEST 下载链接为:https://code.google.com/p/googletest/downloads/list 目前GTEST的最新版本为gtest-1.7.0.zip,因此我 ...

  2. MySQL5.7.10配置和使用

    前两天搞mybatis和springmvc的结合,搞了半天项目就是跑不起来,由于都没有接触过,也不知道原因出在哪里.今天想彻底学习下mybatis,于是就想使用MySQL.从官网上下了,MySQL-5 ...

  3. js验证开头不为零的正整数

    WST.zhengZhengShuIn = function (className){ var rex = /^[1-9]{1}[0-9]*$/;//正整数 $("."+class ...

  4. MongoDb进阶实践之四 MongoDB查询命令详述

    一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命名和删除.有了这些基 ...

  5. Linux xxd命令

    一.简介 xxd 命令用于使用二进制或十六进制格式显示文件内容,可以将指定文件或标准输入以十六进制转储,也可以把十六进制转储转换成原来的二进制形式. 二.选项 http://www.cnblogs.c ...

  6. OpenSource.iOS.ProtobufWithObjective-C

    2. 在iOS(Mac OS X)中使用protobuf 2.0 构建protoc A) 下载最新的protobuf版本 B) 依据README中的步骤依次进行 2.1 添加protobuf到工程中 ...

  7. code1213 解的个数 扩展欧几里得

    很不错的题,加深了我对exgcd的理解 (以前我认为做题就是搜索.dp...原来数学也很重要) 理解了几个小时,终于明白了.但我什么都不打算写. 看代码吧: #include<iostream& ...

  8. 什么是tcp协议?

    这是世界上最顶尖的tcp讲解技术...

  9. ocilib初体验

    #ocilib下载 http://sourceforge.net/projects/orclib/files/ #安装 tar -zxvf ocilib-3.9.3-gnu.tar.gz ./conf ...

  10. sci-hub 下载地址更新

    #  2017-12-14 可用 http://www.sci-hub.tw/ 文献共享平台