抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
五、模式与反射
利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护。各种面向对象的程序设计语言都提供了基本相同的机制:比如类、继承、派生、多态等等。但是又有各自的特色,C# 中的反射机制便是一个很重要的工具,好好地利用就可以在实际中发挥很大的作用。
反射是.NET Framework中的一个非常重要的特性。相信绝大多数的朋友都对其有所了解或是已经熟练的应用这项技术。
我们需要根据需求去动态的创建一对象的实例,在程序设计中,通常我们会为了解耦合,把接口的实现对象写入配置文件,让工厂自己去一个特定的地方(配置文
件)找他应该要实例化的对象(接口的实现对象),通过这样来实现“依赖注入(Dependency Injection)”。
本来“依赖注入”需要专门的IOC容器提供,比如Spring.net,Castle这类似的框架产品。而在抽象工厂模式的应用中显然没有这么麻烦,通常的实现就是使用.NET技术‘反射’就可以了。下面是反射的两种常见应用:
应用一:
Activator.CreateInstance("类型");
应用二:
Assembly.Load("程序集名称").CreateInstance("命名空间.类名称");
六、抽象工厂的简单实现
Entity Code
1namespace DesignPattern.AbstractFactory
2{
3 public class User
4 {
5 private int _id;
6 public int Id
7 {
8 get { return _id; }
9 set { _id = value; }
10 }
11
12 private string _name;
13 public string Name
14 {
15 get { return _name; }
16 set { _name = value; }
17 }
18
19 private string _age;
20 public string Age
21 {
22 get { return _age; }
23 set { _age = value; }
24 }
25
26 public User()
27 { }
28
29 public User(int id, string name, string age)
30 {
31 _id = id;
32 _name = name;
33 _age = age;
34 }
35 }
36}
37----------------------------------------------------------------------
38namespace DesignPattern.AbstractFactory
39{
40 public class News
41 {
42 private int _id;
43 public int Id
44 {
45 get { return _id; }
46 set { _id = value; }
47 }
48
49 private string _title;
50 public string Title
51 {
52 get { return _title; }
53 set { _title = value; }
54 }
55
56 private string _context;
57 public string Context
58 {
59 get { return _context; }
60 set { _context = value; }
61 }
62
63 private string _author;
64 public string Author
65 {
66 get { return _author; }
67 set { _author = value; }
68 }
69
70 public News()
71 { }
72
73 public News(int id, string title, string context, string author)
74 {
75 _id = id;
76 _title = title;
77 _context = context;
78 _author = author;
79 }
80 }
81}
82
1namespace DesignPattern.AbstractFactory
2{
3 /**//// <summary>
4 /// 抽象产品角色
5 /// </summary>
6 public interface INews
7 {
8 void Insert(News news);
9 News QueryById(int newsId);
10 }
11
12 /**//// <summary>
13 /// 具体产品角色
14 /// </summary>
15 public class NewsSql:INews
16 {
17 public void Insert(News news)
18 {
19 Console.WriteLine("插入新闻到SQL数据库");
20 }
21
22 public News QueryById(int newsId)
23 {
24 return new News(1, "Hello", " Hello C#!", "beniao");
25 }
26 }
27
28 /**//// <summary>
29 /// 具体产品角色
30 /// </summary>
31 public class NewsAccess : INews
32 {
33 public void Insert(News news)
34 {
35 Console.WriteLine("插入新闻到Access数据库");
36 }
37
38 public News QueryById(int newsId)
39 {
40 return new News(1, "Hello", " Hello C#!", "beniao");
41 }
42 }
43}
1namespace DesignPattern.AbstractFactory
2{
3 /**//// <summary>
4 /// 抽象产品角色
5 /// </summary>
6 public interface IUser
7 {
8 void Insert(User user);
9 User QueryById(int userId);
10 }
11
12 /**//// <summary>
13 /// 具体产品角色
14 /// </summary>
15 public class UserSql:IUser
16 {
17 public void Insert(User user)
18 {
19 Console.WriteLine("Insert SQL OK!");
20 }
21
22 public User QueryById(int userId)
23 {
24 return new User(1, "beniao", "22");
25 }
26 }
27
28 /**//// <summary>
29 /// 具体产品角色
30 /// </summary>
31 public class UserAccess : IUser
32 {
33 public void Insert(User user)
34 {
35 Console.WriteLine("Insert Access OK!");
36 }
37
38 public User QueryById(int userId)
39 {
40 return new User(2, "beniao", "23");
41 }
42 }
43}
1namespace DesignPattern.AbstractFactory
2{
3 /**//// <summary>
4 /// 工厂角色(根据配置文件来确定创建何种对象)
5 /// </summary>
6 public class DataAccess
7 {
8 public static IUser CreateUser()
9 {
10 string obj = ConfigurationManager.AppSettings["usersql"];
11 return (IUser)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
12 }
13
14 public static INews CreateNews()
15 {
16 string obj = ConfigurationManager.AppSettings["newssql"];
17 return (INews)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
18 }
19 }
20***********************************************************************************
21 /**//// <summary>
22 /// 如果根据GOF的定义及UML图,此为抽象工厂角色
23 /// </summary>
24 public class Factory
25 {
26 public virtual IUser CreateUser()
27 {
28 return null;
29 }
30
31 public virtual INews CreateNews()
32 {
33 return null;
34 }
35 }
36
37 /**//// <summary>
38 /// 具体的工厂角色
39 /// </summary>
40 public class SqlFactory:Factory
41 {
42 public override IUser CreateUser()
43 {
44 string obj = ConfigurationManager.AppSettings["usersql"];
45 return (IUser)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
46 }
47
48 public override INews CreateNews()
49 {
50 string obj = ConfigurationManager.AppSettings["newssql"];
51 return (INews)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
52 }
53 }
54
55 /**//// <summary>
56 /// 具体的工厂角色
57 /// </summary>
58 public class AccessFactory : Factory
59 {
60 public override IUser CreateUser()
61 {
62 string obj = ConfigurationManager.AppSettings["useracc"];
63 return (IUser)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
64 }
65
66 public override INews CreateNews()
67 {
68 string obj = ConfigurationManager.AppSettings["newsacc"];
69 return (INews)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance(obj);
70 }
71 }
72}
1namespace DesignPattern.AbstractFactory
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 IUser user = DataAccess.CreateUser();
8 user.Insert(null);
9
10 INews news = DataAccess.CreateNews();
11 news.Insert(null);
12
13 //******************GOF************************
14
15 Factory factory = new SqlFactory();
16 factory.CreateNews().Insert(null);
17 factory.CreateUser().Insert(null);
18
19 factory = new AccessFactory();
20 factory.CreateNews().Insert(null);
21 factory.CreateUser().Insert(null);
22 }
23 }
24}
相关推荐
抽象工厂设计模式抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式 抽象工厂设计模式
在Java中,抽象工厂模式通常用于创建一组相关的或相互依赖的对象,而无需指定它们的具体类。这种模式的关键在于抽象工厂类,它定义了一组接口,用于创建不同产品族的实例。产品族是一组相关或相互依赖的对象,而产品...
抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。 在...
总之,"走进设计模式之抽象工厂"这篇博客深入探讨了抽象工厂模式的原理、实现方式、应用场景及其优缺点,旨在帮助读者理解并有效地运用这一设计模式。通过阅读博客和分析提供的代码示例,开发者可以更好地掌握抽象...
抽象工厂模式是设计模式中的一种,尤其适用于创建一组相关或相互依赖的对象。这个实例Demo将向我们展示如何在iOS环境中应用抽象工厂模式。 抽象工厂模式的核心思想是提供一个接口,用于创建一系列相关或相互依赖的...
《NET设计模式之抽象工厂模式》 抽象工厂模式是设计模式中的一种,属于创建型模式,它的主要目的是为了解决在软件系统中,面对一系列相互依赖的对象的创建问题。这种模式提供了一个创建一系列相关或相互依赖对象的...
在抽象工厂模式中,提供了一个接口,用于创建相关或依赖对象的家族,而无需指定其具体的类。这在处理不同平台、系统环境或者产品族时非常有用,可以确保用户始终使用同一族的产品,而不会混用来自不同族的产品。 在...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...
在"JAVA设计模式之抽象工厂模式"的示例中,可能会包含这些角色的实现以及如何在实际场景中应用抽象工厂模式的解释和示例代码。这个压缩包可能包含了详细的设计和实现,帮助学习者深入理解抽象工厂模式的工作原理及其...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
java设计模式之抽象工厂模式实例,希望对大家有所帮助。
抽象工厂模式是设计模式中的一种,它属于创建型模式,主要解决的是当系统有多个产品族,而每个产品族又有多个具体产品时,如何组织代码的问题。在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于...
抽象工厂模式是一种创建型设计模式,它的主要目标是提供一个接口或抽象类,用于创建一系列相关或依赖的对象。该模式的主要优点在于,它可以为客户端代码提供一个统一的接口,使得客户端无需关心具体实现细节。抽象...
实验的核心在于理解和实践**抽象工厂模式**,这是一种常用的面向对象设计模式,旨在解决软件设计中的灵活性和扩展性问题。实验的目标包括: 1. **深入理解抽象工厂模式的基本概念和原理**:通过理论学习和实际操作...
抽象工厂模式是设计模式中的一种,属于创建型模式,它提供了一个创建对象的接口,但允许子类决定实例化哪些类。这个模式的关键在于为一组相关或相互依赖的对象提供一个统一的接口,而无需指定他们的具体实现。 抽象...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...
设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂模式 反射 配置文件 设计模式 抽象工厂...
抽象工厂模式是最为复杂的一种工厂模式,它提供了创建相关或依赖对象的家族,而无需指定它们的具体类。这种模式主要用于当产品族中的对象需要一起使用时,确保它们都属于同一产品等级结构。抽象工厂可以确保客户端...
总结来说,Java设计模式之抽象工厂模式是一种用来创建一系列相关对象的设计模式,它通过提供抽象工厂接口来隔离具体产品的创建,使系统具备更好的扩展性和封装性。在实际开发中,我们可以根据需求选择使用抽象工厂...