C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
一、引言 ? 2.1、动机(Motivate): ? 2.3、结构图(Structure) ????? (1)、抽象产品类角色(AbstractProduct):为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。
1 /// <summary> 2 /// 下面以不同系列房屋的建造为例子演示抽象工厂模式 3 因为每个人的喜好不一样,我喜欢欧式的,我弟弟就喜欢现代的 4 客户端调用 5 </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 // 哥哥的欧式风格的房子 11 AbstractFactory europeanFactory= new EuropeanFactory(); 12 europeanFactory.CreateRoof().Create(); 13 europeanFactory.CreateFloor(). 14 europeanFactory.CreateWindow(). 15 europeanFactory.CreateDoor().Create(); 16 17 18 弟弟的现代风格的房子 19 AbstractFactory modernizationFactory = ModernizationFactory(); 20 modernizationFactory.CreateRoof().Create(); 21 modernizationFactory.CreateFloor().Create(); 22 modernizationFactory.CreateWindow().Create(); 23 modernizationFactory.CreateDoor().Create(); 24 Console.Read(); 25 } 26 } 27 28 29 抽象工厂类,提供创建不同类型房子的接口 30 31 public abstract AbstractFactory 32 { 33 抽象工厂提供创建一系列产品的接口,这里作为例子,只给出了房顶、地板、窗户和房门创建接口 34 abstract Roof CreateRoof(); 35 Floor CreateFloor(); 36 Window CreateWindow(); 37 Door CreateDoor(); 38 } 39 40 41 欧式风格房子的工厂,负责创建欧式风格的房子 42 43 EuropeanFactory : AbstractFactory 44 { 45 制作欧式房顶 46 override Roof CreateRoof() 47 { 48 return EuropeanRoof(); 49 50 51 制作欧式地板 52 Floor CreateFloor() 53 54 EuropeanFloor(); 55 } 56 57 制作欧式窗户 58 Window CreateWindow() 59 60 EuropeanWindow(); 61 } 62 63 制作欧式房门 64 Door CreateDoor() 65 66 EuropeanDoor(); 67 68 69 70 71 现在风格房子的工厂,负责创建现代风格的房子 72 73 ModernizationFactory : AbstractFactory 74 75 制作现代房顶 76 77 78 ModernizationRoof(); 79 80 81 制作现代地板 82 83 { 84 ModernizationFloor(); 85 } 86 87 制作现代窗户 88 89 { 90 ModernizationWindow(); 91 } 92 93 制作现代房门 94 95 96 ModernizationDoor(); 97 98 } 99 100 101 房顶抽象类,子类的房顶必须继承该类 102 103 Roof 104 105 106 创建房顶 107 108 void Create(); 109 } 110 111 112 地板抽象类,子类的地板必须继承该类 113 114 Floor 115 { 116 117 创建地板 118 119 120 121 122 123 窗户抽象类,子类的窗户必须继承该类 124 125 Window 126 127 128 创建窗户 129 130 131 132 133 134 房门抽象类,子类的房门必须继承该类 135 136 Door 137 138 139 创建房门 140 141 142 143 144 145 欧式地板类 146 147 EuropeanFloor : Floor 148 149 override Create() 150 151 Console.WriteLine("创建欧式的地板"); 152 153 154 155 156 157 欧式的房顶 158 159 EuropeanRoof : Roof 160 161 162 163 Console.WriteLine(创建欧式的房顶164 165 166 167 168 169 欧式的窗户 170 171 EuropeanWindow : Window 172 173 174 175 Console.WriteLine(创建欧式的窗户176 177 178 179 180 181 欧式的房门 182 183 EuropeanDoor : Door 184 185 186 187 Console.WriteLine(创建欧式的房门188 189 190 191 192 现代的房顶 193 194 ModernizationRoof : Roof 195 196 197 198 Console.WriteLine(创建现代的房顶199 200 201 202 203 现代的地板 204 205 ModernizationFloor : Floor 206 207 208 209 Console.WriteLine(创建现代的地板210 211 212 213 214 现代的窗户 215 216 ModernizationWindow : Window 217 218 219 220 Console.WriteLine(创建现代的窗户221 222 223 224 225 现代的房门 226 227 ModernizationDoor : Door 228 229 230 231 Console.WriteLine(创建现代的房门232 233 }
1 2 先为表弟的房子来建立一个工厂类吧 3 4 ClassicalFactory : AbstractFactory 5 6 创建房顶 7 8 9 ClassicalRoof(); 10 11 12 创建地板 13 14 15 ClassicalFloor(); 16 17 18 创建窗户 19 20 21 ClassicalWindow(); 22 23 24 创建房门 25 26 27 ClassicalDoor(); 28 29 30 31 32 古典的房顶 33 34 ClassicalRoof : Roof 35 36 37 38 Console.WriteLine(创建古典的房顶39 40 41 42 43 古典的地板 44 45 ClassicalFloor : Floor 46 47 48 49 Console.WriteLine(创建古典的地板50 51 52 53 54 古典的窗户 55 56 ClassicalWindow : Window 57 58 59 60 Console.WriteLine(创建古典的窗户61 62 63 64 65 古典的房门 66 67 ClassicalDoor: Door 68 69 70 71 Console.WriteLine(创建古典的房门72 73 }
1 DbProviderFactory 2 3 virtual bool CanCreateDataSourceEnumerator 4 5 get 6 7 false; } 9 10 11 virtual DbCommand CreateCommand() 12 13 null15 16 DbCommandBuilder CreateCommandBuilder() 17 18 19 20 21 DbConnection CreateConnection() 23 24 25 26 DbConnectionStringBuilder CreateConnectionStringBuilder() 27 28 31 DbDataAdapter CreateDataAdapter() 32 33 34 35 DbParameter CreateParameter() 38 40 41 CodeAccessPermission CreatePermission(PermissionState state) 42 43 44 45 46 DbDataSourceEnumerator CreateDataSourceEnumerator() 47 48 49 51 }
sealed SqlClientFactory : DbProviderFactory,IServiceProvider readonly SqlClientFactory Instance = SqlClientFactory(); 4 5 7 9 true11 12 private SqlClientFactory() 15 16 17 18 19 SqlCommand(); 21 22 23 24 SqlCommandBuilder(); 25 26 27 29 SqlConnection(); 30 31 32 33 34 SqlConnectionStringBuilder(); 36 37 38 39 SqlDataAdapter(); 42 43 44 SqlParameter(); 45 46 49 SqlClientPermission(state); 51 52 53 54 return SqlDataSourceEnumerator.Instance; 55 56 57 object IServiceProvider.GetService(Type serviceType) 58 59 object result = 60 if (serviceType == GreenMethods.SystemDataCommonDbProviderServices_Type) 62 result = GreenMethods.SystemDataSqlClientSqlProviderServices_Instance(); 63 64 result; 65 66 } OdbcFactory也是具体工厂类 OdbcFactory : DbProviderFactory readonly OdbcFactory Instance = OdbcFactory(); OdbcFactory() 7 8 9 11 OdbcCommand(); 13 14 16 OdbcCommandBuilder(); 18 OdbcConnection(); 26 OdbcConnectionStringBuilder(); 28 29 31 OdbcDataAdapter(); 33 34 36 OdbcParameter(); 38 39 41 OdbcPermission(state); 43 } 当然,我们也有OleDbFactory 类型,都是负责具体的数据库操作。DbProviderFactory就是【抽象工厂】模式UML里面AbstractFactory类型。其他具体的工厂类型继承DbProviderFactory类型,这个结构很简单,我就不画图了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |