asp.net—工厂模式
2024-09-14 03:49:47
一、什么是工厂模式
定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
二、怎么使用工厂模式
首先模拟一个场景:有一个汽车工厂, 可以日本车、美国车、中国车。。。
这个场景怎么用工厂模式表达出来呢?
要生产汽车所以首先要有个汽车类
//抽象一个汽车类
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)客户端可以通过子类来指定创建对应的对象。
最新文章
- 在Centos中部署redis运行状态图形化监控工具 — RedisLive
- php判断数据库是否连接成功的测试例子
- 一些Layout的坑
- BCB中实现拖拽Panel 改变位置和大小的代码
- EntityFramework Code First 手写代码实现生成数据库
- Revit如何修改三维视图背景色
- BlockingQueue详解
- 腾讯sdk学到了
- div内的img下出现几像素的空白间距解决办法
- Oracle程序包
- ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()
- 浅谈C++中指针和引用的区别
- wchar_t是内置还是别名(亲测有效:wchar_t在windows下是16位整数的别名,在linux等平台下是32位整数的别名。MSVC2008开始默认是/Zc:wchar_t)
- 老李分享:loadrunner用javavuser进行接口测试
- 数据分析与展示——Pandas数据特征分析
- PCB设计流程
- Error: Cannot fit requested classes in a single dex file (# methods: 149346 >; 65536)
- openpyxl工具总结
- 理解Array.prototype.slice.call(arguments)
- 【洛谷p1605】迷宫
热门文章
- Codeforces Beta Round #12 (Div 2 Only)
- 【趣】Python获取变量的变量名
- TZOJ 4813 机器翻译(模拟数组头和尾)
- OOP的几个不常用的方法
- Visual Event查看页面相关绑定事件
- jdeveloper基础教程(中文版)
- struts框架问题四之获取到值栈的对象
- [Selenium]对弹出的Alert窗口进行操作
- a标签的四个伪类
- 十年前,女:“对不起,我不会喜欢你的,你不要再坚持了,就好比让 Linux 和 Windows 同时运行在一台PC机上,可能吗?