一:简单工厂模式

  1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例。

  2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创建什么对象事例,而不关心怎么创建,当需要引入新产品就不需要修改客户端的代码,只需要添加相应的产品类并修改工厂类就可以,所以从产品的角度上简单工厂模式是符合“开-闭”原则的。

  3:缺点:很容易违反高内聚低耦合的原则,一旦添加新产品就不得不修改工厂逻辑,当产品类型较多时,有可能造成工厂逻辑比较复杂,不利于系统的扩展和维护,所以从工厂的角度来说简单工厂模式是不符合“开-闭”原则的。

  4:例子:

namespace SimpleFactoryDemo
{
class Program
{
static void Main(string[] args)
{
ShapeFactory shapeFactory = new ShapeFactory();
shapeFactory.getShape("circle").draw();
shapeFactory.getShape("rectangle").draw();
shapeFactory.getShape("square").draw();
Console.ReadKey();
}
}
public interface IShape
{
void draw();//默认公共方法
}
public class Circle : IShape
{
public void draw()
{
Console.WriteLine("画个圆");
}
}
public class Rectangle : IShape
{
public void draw()
{
Console.WriteLine("画个长方形");
}
}
public class Square : IShape
{
public void draw()
{
Console.WriteLine("画个正方形");
}
}
public class ShapeFactory//形状工厂
{
public IShape getShape(string type)
{
if ("circle".Equals(type))
{
return new Circle();
}
else if ("rectangle".Equals(type))
{
return new Rectangle();
}
else if ("square".Equals(type))
{
return new Square();
}
else
{
return null;
}
}
}
}

二:工厂模式

  1:描述:定义一个创建对象的工厂接口,让子类决定实例化哪个类,将实际创建工作推迟到子类中。

  2:优点:创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑移动到客户端,工厂方法克服了简单工厂所违背的的开闭原则的缺点,扩展性高,易于维护,想要增加一个产品,只需要增加一个工厂类即可。

  3:例子:

namespace FactoryDemo
{
class Program
{
static void Main(string[] args)
{
IShapeFactory circleFactory = new CircleFactory();
circleFactory.getShape().draw();
IShapeFactory rectangleFactory = new RectangleFactory();
rectangleFactory.getShape().draw();
IShapeFactory squareFactory = new SquareFactory();
squareFactory.getShape().draw();
Console.ReadKey();
}
}
public interface IShape
{
void draw();//默认公共方法
}
public class Circle : IShape
{
public void draw()
{
Console.WriteLine("画个圆");
}
}
public class Rectangle : IShape
{
public void draw()
{
Console.WriteLine("画个长方形");
}
}
public class Square : IShape
{
public void draw()
{
Console.WriteLine("画个正方形");
}
}
public interface IShapeFactory//形状工厂接口
{
IShape getShape();
}
public class CircleFactory : IShapeFactory
{
public IShape getShape()
{
return new Circle();
}
}
public class RectangleFactory : IShapeFactory
{
public IShape getShape()
{
return new Rectangle();
}
}
public class SquareFactory : IShapeFactory
{
public IShape getShape()
{
return new Square();
}
}
}

三:抽象工厂模式

  1:描述:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

  2:优点:(1):当一个产品族中的多个对象被设计在一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

        (2):具有工厂方法模式解耦的优点。

        (3):工厂方法模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构,最主要的是可以在类的内部对产品族的关联关系进行定义和描述。

  3:例子:以生产两款车子为例,一个工厂生产宝马和比亚迪两款汽车,同时生产国产和进口两种发动机。

namespace AbstractFactoryDemo
{
class Program
{
static void Main(string[] args)
{
IFactory carAFactory = new CarA();
carAFactory.ProductCar().ProductCar();
carAFactory.ProductEngine().ProductEngine(); IFactory carBFactory = new CarB();
carBFactory.ProductCar().ProductCar();
carBFactory.ProductEngine().ProductEngine(); Console.ReadKey(); }
}
public interface ICarFactory
{
void ProductCar();
}
public class BMWCar : ICarFactory
{
public void ProductCar()
{
Console.Write("宝马汽车:");
}
}
public class BYDCar : ICarFactory
{
public void ProductCar()
{
Console.Write("比亚迪汽车:");
}
}
public interface IEngineFactory
{
void ProductEngine();
}
public class DomesticEngine : IEngineFactory
{
public void ProductEngine()
{
Console.WriteLine("国产发动机");
}
}
public class ImportEngine : IEngineFactory
{
public void ProductEngine()
{
Console.WriteLine("进口发动机");
}
}
public interface IFactory
{
ICarFactory ProductCar();
IEngineFactory ProductEngine();
}
public class CarA : IFactory//宝马汽车,进口发电机
{
public ICarFactory ProductCar()
{
return new BMWCar();
}
public IEngineFactory ProductEngine()
{
return new ImportEngine();
}
}
public class CarB : IFactory//比亚迪汽车,国产发电机
{
public ICarFactory ProductCar()
{
return new BYDCar();
}
public IEngineFactory ProductEngine()
{
return new DomesticEngine();
}
}
}

四:总结

1:无论是简单工厂模式,工厂模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上都极为相似,他们的最终目的都是为了解耦,所以在实际开发中灵活运用工厂模式,达到降低耦合度的目的。

C#设计模式——简单工厂模式、工厂模式和抽象工厂模式的更多相关文章

  1. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  2. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  3. php设计模式课程---3、为什么会有抽象工厂方法

    php设计模式课程---3.为什么会有抽象工厂方法 一.总结 一句话总结: 解决简单工厂方法增加新选择时无法满足面向对象编程中的开闭原则问题 1.什么是面向对象编程中的开闭原则? 应该对类的增加开放, ...

  4. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...

  5. Android设计模式(十二)--抽象工厂模式

    问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...

  6. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  7. 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)

    博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...

  8. 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)

      抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...

  9. 工厂模式(Factory)和抽象工厂模式(Abstract Factory)

    一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.     ...

  10. FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

    具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...

随机推荐

  1. Android -Services 使用简介

    Android Services 四大组件之一,主要用于后台长时间运行.没有界面.这里讲解两种services的启动还有AIDL通信方式. 1.startservices a.建立继承services ...

  2. 11-22 ArrayList

    自己定义一个类 public class Student{ public String name; //属性 public void fangfa(){ //方法 } } 在另一个java文件里可以调 ...

  3. Django开启国际化的支持

    基础环境介绍 IDE我用的pycharm Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13) [GCC 4.2.1 (Apple Inc ...

  4. Vuejs——(13)组件——杂项

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  5. BASH 基本语法

    本节内容 1.  什么是shell script 2.  变量 3.  运算符 4.  流程控制 5.  函数 6.  计划任务 crontab 一  什么是shell script 将OS命令堆积到 ...

  6. zookeeper配置文件共享中心

    最近频繁的系统上线,每次打包都要把配置文件替换为正式环境的配置文件,虽然说就是复制粘贴的事,架不住文件杂乱,而且多. 期初的想法是有没有办法将配置文件与系统隔离开来,这样在更新时候,就只需要更新代码部 ...

  7. Servlet案例6:显示用户的上次访问时间

    这里是cookie的简单应用 告诉用户您的上次访问时间是:xxxx-xx-xx xx:xx:xx 思路: 第一次访问该网站时候,记录当前访问时间(new Date()) 把当前时间以cookie的形式 ...

  8. java后端导入excel模板和导入excel文件去读数据

    模板转载地址:https://www.cnblogs.com/zhangyangtao/p/9802948.html 直接上代码(我是基于ssm写的demo,导入文件目前只能读取.xls后缀的exce ...

  9. Tools - Vim

    Vim 简明 Vim 练级攻略 基础设置 在vim界面点击":"然后进行设置,但只会在当前vim界面生效: 添加相关设置在vim配置文件(例如"/etc/vimrc&qu ...

  10. python 牛客网 你的输出为:空。请检查一下你的代码,有没有循环输入处理多个case。问题解决

    你的输出为:空.请检查一下你的代码,有没有循环输入处理多个case.点击查看如何处理多个case 核心:他这个程序测试正确与否的流程是 连续输入多组测试数据进行测试,只有每组数据都对才行 所以必须使用 ...