参考:head first 设计模式
应用场景
解决工厂方法模式中存在的不足。
工厂方法中只能创建一类产品,不能创建多种类别的产品。
比如海尔,TCL都可以做空调,手机,冰箱,电视等。
当系统中有多种产品,每个工厂来负责创建同一族别但属于不同类结构的产品。
一次很可能只创建一种产品。
再比如:绝味鸭脖想在湖南或河南开工厂,可以做鸭脖,鸭掌,鸭翅等。但两地的口味不一样,
有的喜欢吃辣的,有的喜欢吃麻的,其它地方也可能是其它的口味,那么它将根据当地的习惯来
创建不同味道的产品。
结构
抽象工厂:AbstractFactory 定义创建产品的功能(可以接口或抽象类),它为访问类提供了一个创建一组相关或相互依赖对象的接口,它是工厂方法模式的升级。
具体工厂:ConcreteFactory 定义创建何种产品以及具体创建
抽象产品:Product 定义产品的特征和功能(可为接口或抽象类)
具体产品:ConreteProduct 空调 电视 实现抽象产品功能特征的实现
图例
特点
加入了抽象工厂来创建一组产品,无需关心具体创建的产品是什么
优点:可以在工厂类的内部对产品族中的同级别的产品进行管理,不必引入多个新类来进行管理;当增加一个新产品的时候不需要改动源代码。
缺点:当产品族中加入新的产品时,所有的工厂类都要进行修改。比如海尔、tcl都要生产车,就需要进行修改工厂类
系统自带
System.Data.Common.DbProviderFactory
看 代码2
代码1
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern
{
public class AbstractFactory1
{
public static void main()
{
//TCL工厂生产的手机和电视
TCLFactory nfact = new TCLFactory();
nfact.CreatePhone().ToString();
nfact.CreateTV().ToString();
nfact.CreatePhone().Produce();
nfact.CreateTV().Produce();
//格力工厂生产的手机和电视
GeLiFactory sfact = new GeLiFactory();
sfact.CreatePhone().ToString();
sfact.CreateTV().ToString();
sfact.CreatePhone().Produce();
sfact.CreateTV().Produce();
}
}
/// <summary>
/// 抽象工厂类,提供创建两个不同厂家的手机和电视
/// </summary>
public abstract class AbstractFactory
{
public abstract Phone CreatePhone();
public abstract Tv CreateTV();
}
/// <summary>
/// TCL生产手机和电视
/// </summary>
public class TCLFactory : AbstractFactory
{
public override Phone CreatePhone()
{
return new TclPhone();
}
public override Tv CreateTV()
{
return new TclTV();
}
}
/// <summary>
/// 格力生产手机和电视
/// </summary>
public class GeLiFactory : AbstractFactory
{
public override Phone CreatePhone()
{
return new GeLiPhone();
}
public override Tv CreateTV()
{
return new GeLiTV();
}
}
/// <summary>
/// 抽象类,供每个厂家继承
/// </summary>
public abstract class Phone
{
public abstract void Produce();
}
/// <summary>
/// 抽象类,供每个厂家继承
/// </summary>
public abstract class Tv
{
public abstract void Produce();
}
/// <summary>
/// TCL手机
/// </summary>
public class TclPhone : Phone
{
public override void Produce()
{
Console.WriteLine(nameof(TclPhone));
}
}
/// <summary>
/// TCL电视
/// </summary>
public class TclTV : Tv
{
public override void Produce()
{
Console.WriteLine(nameof(TclTV));
}
}
/// <summary>
/// 格力手机
/// </summary>
public class GeLiPhone : Phone
{
public override void Produce()
{
Console.WriteLine(nameof(GeLiPhone));
}
}
/// <summary>
/// 格力电视
/// </summary>
public class GeLiTV : Tv
{
public override void Produce()
{
Console.WriteLine(nameof(GeLiTV));
}
}
//如何应对变更?比如志高厂家 想生产手机和电视
//只需添加3个类 ZhiGaoFactory ZhiGaoPhone ZhiGaoTv
//ZhiGaoFactory,其它两个类负责具体产品的创建 这里不再具体实现
}
代码2
//.net中抽象工厂模式的实现System.Data.Common.DbProviderFactory
//DbProviderFactory是一个抽象工厂,它提供了创建数据库连接时所需要的对象集合的接口
//实际创建的工作在其子类工厂中进行,微软提供了SqlServer的具体工厂类实现
public abstract class DbProviderFactory
{
protected DbProviderFactory();
public virtual bool CanCreateDataSourceEnumerator{get;}
public virtual DbCommand CreateCommand();
//建造者模式的应用,大家可以自己扒拉下源码
public virtual DbCommadBuilder CreateCommandBuilder();
public virutal DbConnection CreateConnection();
//建造者模式的应用
public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
//适配器模式的应用
public virtual DbDataAdapter CreateDataAdapter();
//迭代器模式的应用
public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
public virtual DbParameter CreateParameter();
public virtual CodeAccessionPermission CreatePermission(PermissionState state);
}
//现在微软开源了可以看下代码
//其中用到几个模式,大家可以自己扒拉下源码
using System;
using System.Data;
using System.Data.Common;
using System.Data.Sql;
using System.Security;
using System.Security.Permissions;
namespace System.Data.SqlClient{
public sealed class SqlClientFactory:DbProviderFactory,IServiceProvider{
public static readonly SqlClientFactory Instance = new SqlClientFactory();
private SqlClientFactory(){
}
public override bool CanCreateDataSourceEnumerator{
get{
return true;
}
}
public override DbCommand CreateCommand(){
return new SqlCommand();
}
public override DbCommandBuilder CreateCommandBuilder(){
return new SqlCommandBuilder();
}
public override DbConnection CreateConnection(){
return new SqlConnection();
}
public override DbConnectionStringBuilder CreateConnectionStringBuilder(){
return new SqlConnectionStringBuilder();
}
public override DbDataAdapter CreateDataAdapter(){
return new SqlDataAdapter();
}
public override DbParameter CreateParameter(){
return new SqlParameter();
}
public override CodeAccessPermission CreatePermission(PermissionState state) {
return new SqlClientPermission(state);
}
public override DbDataSourceEnumerator CreateDataSourceEnumerator() {
return SqlDataSourceEnumerator.Instance;
}
/// <summary>
/// Extension mechanism for additional services; currently the only service
/// supported is the DbProviderServices
/// </summary>
/// <returns>requested service provider or null.</returns>
object IServiceProvider.GetService(Type serviceType){
object result = null;
if(serviceType==GeeenMethods.SystemDataCommonDbProviderServvices_Type){
result = GreenMethods.SystemDataSqlClientSqlProviderServices_Instance();
}
return result;
}
}