C#设计模式——简单工厂模式、工厂模式和抽象工厂模式
一:简单工厂模式
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#设计模式——简单工厂模式、工厂模式和抽象工厂模式的更多相关文章
- 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- php设计模式课程---3、为什么会有抽象工厂方法
php设计模式课程---3.为什么会有抽象工厂方法 一.总结 一句话总结: 解决简单工厂方法增加新选择时无法满足面向对象编程中的开闭原则问题 1.什么是面向对象编程中的开闭原则? 应该对类的增加开放, ...
- headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
- Android设计模式(十二)--抽象工厂模式
问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)
博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- 工厂模式(Factory)和抽象工厂模式(Abstract Factory)
一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者. ...
- FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式
具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...
随机推荐
- <Listener>servletContextListener、httpSessionListener和servletRequestListener使用整理
在java web应用中,listener监听器似乎是不可缺少的.经常常使用来监听servletContext.httpSession.servletRequest等域对象的创建.销毁以及属性的变化等 ...
- azkaban disable 停用部分工作流
在使用azkaban作为调度工具的时候,难免遇到只需要跑工作流某部分的情况,这时需要用到停用部分工作的操作, 如图:
- Docker基础-使用Dockerfile创建镜像
1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - ED ...
- 9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in ...
- Lambda表达式where过滤数据
使用Lambda的表达式来过滤符合条件的数据.下面的代码实现,是把字符阵列中,把名字长度等于3元素找出来. class Bv { public void LambdaExpression() { st ...
- 软件包管理之rpm与yum
软件包的安装和卸载时很平常的事,但在Linux上面却不简单..Linux的其中一个哲学就是一个程序只做一件事,并且做好.组合小程序来完成复杂的任务,这样做有很多好处,但是各个小程序之间往往会存在着复杂 ...
- 安装过redis集群,重新做集群办法:
二:找到问题:这个地方IP的问题,以上是正确的版本,以前有问题的版本的Ip是127.0.0.1, 原因是这个地方以前我没注释redis.conf文件中的bind 127.0.0.1 然后做集群时使用的 ...
- 带你走进CSS定位详解
学习CSS相关知识,定位是其中的重点,也是难点之一,如果不了解css定位有时候都不知道怎么用,下面整理了一下关于定位属性的具体理解和应用方案. 一:定位 定位属性列表 position top bot ...
- RabbitMQ服务端配置详解
RabbitMQ支持三种配置方式: 1) 读取环境变量中配置, 这包括shell中环境变量和rabbitmq-env.conf/rabbitmq-env-conf.bat文件中配置的环境变量 可配置如 ...
- numpy 介绍
NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩 ...