抽象工厂方法模式(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日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实 ...
随机推荐
- Alpha项目复审
队名 优点 缺点 排名 拉登是我罩的 1.最底层.从无到有实现的软硬件结合的俄罗斯方块游戏. 2.从画电路原理图.PCB电路板设计.接线.操作系统(没用到操作系统).驱动程序.应用程序开发,串口通信. ...
- 异常:已捕获: "Error creating context 'spring.root': 未将对象引用设置到对象的实例。" (System.Configuration.ConfigurationErrorsException) 捕获到一个 System.Configuration.ConfigurationErrorsException: "Error creating context 'sp
查看所指定name的context是否注册成功,以后用此容器来获取其中的object. 常见的使用方式: Application_Start中使用ContextRegistry.GetContext( ...
- ASP.NET MVC Controller 编程所涉及到的常用属性成员
Controller (System.Web.Mvc.Controller) 1.获取路由中的各个值 Request.RequestContext.RouteData.Values["id& ...
- HTTP总结
参考: https://www.cnblogs.com/fuqiang88/p/5956363.html https://www.cnblogs.com/zlingh/p/5887143.html h ...
- servlet 核心技术
servlet 核心技术 servlet 生命周期 在 servlet 生命周期中,servlet 容器完成加载 servlet 类和实例化一个 servlet 实例,并通过3个方法来完成生命周期中的 ...
- 【BZOJ3622】已经没什么好害怕的了 容斥原理+dp
Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT 输入的2*n个数字保证全不相 ...
- Reviewing notes 1.1 of Advanced algebra
♦Linear map Definition Linear map A linear map from vector space V to W over a field F is a function ...
- jenkins安装maven工具
下载maven工具,然后解压到/usr/local下面 然后在jenkins上面添加maven工具.指定他的设置配置文件(全局) 指定maven的目录位置 应用保存即可 !!! 虽然maven安装简单 ...
- 二 ASP.NET MVC 第一个程序 hello world
二 ASP.NET MVC 第一个程序 hello world https://blog.csdn.net/xmroom/article/details/51335917 我使用的Visual s ...
- Hibernate学习笔记(三)—— Hibernate的事务控制
Hibernate是对JDBC的轻量级封装,其主要功能是操作数据库.在操作数据库过程中,经常会遇到事务处理的问题,接下来就来介绍Hibernate中的事务管理. 在学习Hibernate中的事务处理之 ...