一.简单工厂模式(UML类图):

核心类代码:

public class Calc
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public virtual double GetResult()
{
double result = ;
return result;
}
}

用于返回计算结果

public class Add : Calc
{
public override double GetResult()
{
return NumberA + NumberB;
}
}

四则运算类

public class CalcFactory
{
public static Calc CalcValue(string operate)
{
Calc calc = null;
switch (operate)
{
case "+":
calc = new Add();
break;
case "-":
calc = new Sub();
break;
case "*":
calc = new Mul();
break;
case "/":
calc = new Div();
break;
}
return calc;
}
}

用于判断计算的工厂

客户端进行调用:

static void Main(string[] args)
{
Calc calc = CalcFactory.CalcValue("+");
calc.NumberA = ;
calc.NumberB = ;
Console.WriteLine(calc.GetResult());
Console.ReadKey();
}

二.工厂方法模式(UML类图):

   工厂方法模式(Factory Method)是一种创建型的设计模式,在该模式中父类决定实例的生成方式。但是不决定它要生成的具体的类,具体的处理是交给子类完成的,这样将生成实例的框架和负责生成实例的类解耦。

核心类代码:

public interface IFactory
{
Calc createCalc();
}

工厂接口,创建计算

public class AddFactory:IFactory
{
public Calc createCalc()
{
return new Add();
}
}

加法工厂

客户端进行进行调用:

static void Main(string[] args)
{
IFactory fact = new AddFactory();
Calc calc= fact.createCalc();
calc.NumberA = ;
calc.NumberB = ;
Console.WriteLine(calc.GetResult());
Console.ReadKey();
}

三.工厂方法模式(一个工厂一个产品): 

  从简单入手,下面通过制作身份证IDCard来了解工厂模式:

  • 产品类(Product):

    • 在该类中仅仅声明了一个抽象方法use(),定义了任意产品都可以use的方法,即定义了生成的实例所持有的接口方法。
public abstract class Product
{
public abstract void Use();
}

产品类

  • 工厂类(Factory):
    • 该工厂是生产Product类,负责生成产品Product,但是具体处理交由具体创建者。对于使用生成实例的专用方法createProduct创建实例,而不用new关键字来生成,这样做的好处是可以防止,父类与其他类耦合

      • create:创建产品
      • createProduct(抽象方法):顶层负责调用,底层负责实现
      • registerProduct(抽象方法):注册产品。
public abstract class Factory
{
public Product create(string name)
{
Product product = createProduct(name);
registerProduct(product);
return product;
}
protected abstract Product createProduct(string name);
protected abstract void registerProduct(Product product);
}

工厂类

  • 具体产品类:
    • 身份证IDCard属于一个具体的产品,继承自Product,是具体的产品,来实现产品抽象类的内容
      • 具体的由谁制作“身份证IDCard”
      • 具体的由谁使用“身份证IDCard”
      • 提供一个获取这个具体的Name
public class IDCard:Product
{
string name;
public IDCard(string name)
{
Console.WriteLine("制作卡片:"+name);
this.name=name;
}
public override void Use()
{
Console.WriteLine(name+"使用卡片");
}
public string getName()
{
return name;
}
}

具体产品类IDCard

  • 具体的工厂类(什么工厂):

    • 为了方便理解,所以这个工厂就生产单一的产品,“身份证IDCard” 

      • 在顶层直接调用生产的方法就可以了,具体生产由具体的底层实现就可以了。
      • 将创建的产品信息注册到ArrayList中,返回这个注册信息就知道谁创建的,谁在使用
public class IDCardFactory:Factory
{
ArrayList list = new ArrayList();
protected override Product createProduct(string name)
{
return new IDCard(name);
}
protected override void registerProduct(Product product)
{
IDCard card = (IDCard)product;
list.Add(card.getName());
}
public ArrayList getName()
{
return list;
}
}

具体工厂模式(单一产品)

四.工厂方法模式调用测试:

下面实际调用测试一下:

static void Main(string[] args)
{
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小红");
Product card3 = factory.create("小刚");
card1.use();
card2.use();
card3.use();
Console.ReadKey();
}

  输出信息:

    • 制作ID卡小明
    • 制作ID卡小红
    • 制作ID卡小刚
    • 使用ID卡小明
    • 使用ID卡小红
    • 使用ID卡小刚

C#设计模式--工厂模式(创建型模式)的更多相关文章

  1. [C#]设计模式-工厂方法-创建型模式

    介绍完简单工厂之后,现在就来介绍一下工厂方法模式.之前简单工厂有一个弊端就是每次你需要产生新的产品的时候都需要对创建工厂类进行更改,如同前一篇文章说过的一样最后的后果是工厂类会变得十分庞大. 而工厂方 ...

  2. 初探Java设计模式1:创建型模式(工厂,单例等)

    Java 设计模式 一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混.自认为本文还是写得不错的,花了不少心思来写这文章和做图,力求让读者真的能看着简 ...

  3. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  4. Java经典设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  5. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  6. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...

  7. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  8. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  9. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  10. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

随机推荐

  1. kuangbin专题十二 HDU1074 Doing Homework (状压dp)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. MYSQL查询字段全部为中文的字段

    在实际使用mysql的过程中,会遇到这样的问题,查询字段内容全部为中文内容的数据,对于刚用mysql的小伙伴可能就比较迷失了,不知道怎么使用,其实这个问题很简单,使用下面这个sql语句就可以了 SEL ...

  3. C3算法之我见

    C3算法说到底就是merge算法,看了一些帖子,总结说得莫名其妙,大家也是抄来抄去,我试着用自己的话来把这个东西怎么操作的说清楚.当然了我也要抄一些别人的,但是我会 尽量把我认为别人没有讲清楚的那一部 ...

  4. poj3111 选取物品(二分+贪心)

    题目传送门 题意就是,n个物品,从中选取k个,要按照那个公式所取的值最大. 思路:最大化平均值的时候首先想到的就是二分, 我们设G(x) 为单位的重量不小于X, 我们的目标就是要找到满足条件的最大的X ...

  5. ConvertLongToInstantUtil

    package com.test; import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneId ...

  6. .net core项目中引用.net framework封装的dll库

    https://blog.csdn.net/sharphou/article/details/80746551   A----------如何安装IIS [Server Hosting]------- ...

  7. Could not read settings.xml

    这个问题为什么会发生? 其实不要想太多, 1.文件格式是utf-8 2.其中的报文格式非常重要,千万不能弄错,如果多了一处注释,就会发生以上问题,拼写的时候多注意语义

  8. SQL Server 如何更改SQL Server和windows身份方式验证

    1.安装sql后先用windows账户登陆进去,然后在sql上右键,选择“安全性”-“SQL Server和windows身份验证模式”然后确定 2.找到安全性——登陆名(sa用户)右键——状态,在登 ...

  9. 安装Office 2013 时提示找不到 Office.zh-cn\OfficeLR.cab

    今天安装office2013的时候总是过会就提示找不到OfficeLR.cab文件 在网上找了好多方法不行,后来将注册表里的office选项全部删除就可以了(HKEY_CURRENT_USER\Sof ...

  10. XGBoost算法

    一.基础知识 (1)泰勒公式 泰勒公式是一个用函数在某点的信息描述其附近取值的公式.具有局部有效性. 基本形式如下: 由以上的基本形式可知泰勒公式的迭代形式为: 以上这个迭代形式是针对二阶泰勒展开,你 ...