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 ...
随机推荐
- Chapter6 胞内信号网络
一.一条从细胞表面到细胞核的通路 二.Ras蛋白处于复杂信号级联的中心位置 胞外信号→酪氨酸激酶受体→Shc→Grb→Sos→Ras 三.酪氨酸的磷酸化控制着许多胞内信号蛋白的定位与活动 Src蛋白的 ...
- 【转】B树、B+树、B*树
出处:http://blog.csdn.net/v_JULY_v 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Se ...
- Android studio提速配置
1. C:\Program Files\Android\Android Studio\bin studio64.exe.vmoptions 2.创建 gradle.properties 配置文件
- C++语言学习
1.< >表示包含那些由系统提供的并放在指定子目录中的头文件,对于自己编写的头文件放在当前目录或其他目录下则用双引号” ”; 2.复合类型的声明: int* p1,p2;//p1是指向in ...
- 《mysql必知必会》学习_第20章_20180809_欢
第20章:更新和删除数据 P140 update customers set_emails='elmer@fudd.com' where cust_id=10005; 更新多个列,用逗号隔开.注意被指 ...
- 端口转发工具lcx使用两类
lcx是一款强大的内网端口转发工具,用于将内网主机开放的内部端口映射到外网主机(有公网IP)任意端口.它是一款命令行工具,当然也可以在有权限的webshell下执行,正因如此lcx常被认为是一款黑客入 ...
- tomcat的调优管理
1 记性调整存设定. A: 方法如下: 1. linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat vi catalina. ...
- react中使用阿里Viser图表
参考demo的codesandbox:https://codesandbox.io/s/kxxxx3w5kv 使用步骤: 1. 安装依赖 viser-react和@antv/data-set 2 ...
- 发现CVE-2018-11512-wityCMS 0.6.1 持久型XSS
CMS(内容管理系统)很适合被用来做代码审计,尤其是现在CMS系统越来越流行,很多人愿意使用CMS搭建自己的项目.由于大部分CMS是一种开源项目,所以对于CMS的审计属于白盒测试,白盒测试让我们可以发 ...
- 第九节:详细讲解Java中的泛型,多线程,网络编程
前言 大家好,给大家带来详细讲解Java中的泛型,多线程,网络编程的概述,希望你们喜欢 泛型 泛型格式:ArrayList list= new ArrayList(); ArrayList list= ...