抽象工厂方法模式(Abstract Factory Pattern)
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:汽车工厂生产轿车和卡车,轿车和卡车就是同类产品(都是汽车嘛,汽车内当然大多零件生产是相通的),通过抽象工厂,还可以复用许多代码。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。如示例中,增加一个MiniCar产品,改动较大,但是如果说增加一个五菱品牌(相当于产品等级,肯定比BMW级别低了很多吧),直接继承抽象类扩展即可。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序(因为接口相同,调用工厂的不同方法生产相应操作系统的程序,屏蔽底层操作影响,例如AppFactory.CreateLinuxApp,AppFactory.CreateWindowsApp)。
注意事项:产品族难扩展,产品等级易扩展。
抽象类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
//这里使用抽象类是因为接口必须在子类实现方法,抽象类可以延迟到抽象子类去。
public abstract class AbstractCar
{
public abstract void Run();
public abstract void BeBe();
public abstract void GetBrand();
} public abstract class AbstractCarFactory
{
public static AbstractCarFactory GetInsance()
{
//这里应该去读取配置文件,由于是demo就直接赋值了。
string factoryName = "BMWCarFactory"; AbstractCarFactory instance; if (factoryName != "")
instance = (AbstractCarFactory)Assembly.Load("DesignPattern").CreateInstance("DesignPattern.AbscractFactoryPattern." + factoryName);
else
instance = null; return instance;
}
public abstract AbstractCar CreateSaloonCar();
public abstract AbstractCar CreateTruckCar();
} public abstract class AbstractSaloonCar : AbstractCar
{
public override void Run()
{
Console.WriteLine("我是轿车~~");
} public override void BeBe()
{
Console.WriteLine("嘀嘀嘀~!!!");
}
} public abstract class AbstractTruckCar : AbstractCar
{
public override void Run()
{
Console.WriteLine("我是大卡卡卡卡……");
} public override void BeBe()
{
Console.WriteLine("嘟嘟嘟嘟嘟!!!");
}
}
}
Benz工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
public class BenzCarFactory : AbstractCarFactory
{
public override AbstractCar CreateSaloonCar()
{
return new BenzSaloonCar();
} public override AbstractCar CreateTruckCar()
{
return new BenzTruckCar();
}
} public class BenzSaloonCar : AbstractSaloonCar
{
public override void GetBrand()
{
Console.WriteLine("我是奔驰轿车!!!");
}
} public class BenzTruckCar : AbstractTruckCar
{
public override void GetBrand()
{
Console.WriteLine("我是奔驰大卡!!!");
}
}
}
BMW工厂
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPattern.AbscractFactoryPattern
{
public class BMWCarFactory : AbstractCarFactory
{
public override AbstractCar CreateSaloonCar()
{
return new BMWSaloonCar();
} public override AbstractCar CreateTruckCar()
{
return new BMWTruckCar();
}
} public class BMWSaloonCar : AbstractSaloonCar
{
public override void GetBrand()
{
Console.WriteLine("我是宝马轿车!");
}
} public class BMWTruckCar : AbstractTruckCar
{
public override void GetBrand()
{
Console.WriteLine("我是宝马大卡!!!");
}
}
}
模拟场景
这个月只生产Benz轿车。下个月生产卡车换个方法即可。下一年生产BMW换个工厂即可(修改配置文件)。
//与工厂模式最大区别就是一个产品族的问题,同样的产品拥有很多相同约束,这样就不用重复写代码。
//AbstractCarFactory BenzFactory = new BenzCarFactory();//这里使用反射完全解耦
AbstractCarFactory Factory = AbstractCarFactory.GetInsance();
AbstractCar _saloonCar = Factory.CreateSaloonCar();
_saloonCar.BeBe();
_saloonCar.Run();
_saloonCar.GetBrand();
抽象工厂方法模式(Abstract Factory Pattern)的更多相关文章
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)
分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.工厂模式在<Java 与模式>中分为三类:1)简单工厂模式(Simple Facto ...
- .NET设计模式(5):工厂方法模式(Factory Method)
):工厂方法模式(Factory Method) 工厂方法模式(Factory Method) --.NET设计模式系列之五 Terrylee,2004年1月2日 转载:http://terry ...
- 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明
Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...
- NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)
工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
- .NET设计模式(5):工厂方法模式(Factory Method)(转)
工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
随机推荐
- 再解炸弹人——BFS
原创 之前用了枚举法解炸弹人,题目详情请看我之前的博客:https://www.cnblogs.com/chiweiming/p/9295262.html 利用枚举法是无视地图布局的,枚举法直接全局搜 ...
- 让IE播放PPT
在win7下安装office 2003,想让ppt在ie里播放,然后供winform调用,显示并播放ppt,操作如下 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Power ...
- asp.net mvc 中通过url字符串获取controller和action
在项目中遇到需要通过url字符串获取controller和action的情况,百度了 一下找到了一个可以用的方法 ,在这里分享和记录一下 这个方法是在博客园的博问里看到的 原文地址是http://q. ...
- Android动态显示或隐藏密码框中的密码(Android学习笔记)
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- 三、Node.js-HelloWorld案例
之前我们编写的JavaScript代码都是在浏览器中运行的,因此,我们可以直接在浏览器中敲代码,然后直接运行. 在Node,我们编写的JavaScript代码将不能在浏览器环境中执行了,而是在Node ...
- iOS 查看代码总行数
1.打开终端 2.cd 拖入工程 回车 3.输入命令 find . "(" -name "*.m" -or -name "*.mm" -or ...
- hadoop中常用的hdfs代码操作
一:向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件: package hadoopTest; import org.apache.h ...
- linux命令笔记,零散记录<不完整,学习用>
uname -a 输出系统架构 cp 源文件 目标文件 mv同理 tar –xvf file.tar // 解压 tar包 tar -zxvf file.tar.gz // 解压tar.gz tar ...
- Spring之BeanFactory与ApplicationConText
:BeanFactory基本的工厂解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口ApplicationContext接口implements ...
- 转载 Adobe DreamweaverCS6安装及破解
一:安装 百度链接:链接:http://pan.baidu.com/s/1dF8hTex 密码:zrew (重点) 1) Adobe DreamweaverCS6中文版下载 2)Adobe Dre ...