简单工厂模式是工厂模式的精简,简单工厂模式是工厂模式的精简型
的所有创建模式都涉及创建对象样本的方式。这很重要,因为程序不应该依赖于对象是如何创建和排列的。当然,使用new运算符是C#创建对象最简单的方法。但是实际上相当于硬编码了,关系到程序中如何创建对象管理。在大多数情况下,创建对象的初衷随着程序的需要而变化。将一个抽象对象创建成一个特殊的“creator”类,会使程序更加灵活和通用。工厂方法模式提供了一个简单的决策类,它根据提供的数据返回抽象基类的许多子类之一。
抽象工厂(抽象
工厂模式)提供了创建和返回一系列相关对象的接口。
单一模式(单一
Pattern)意味着一个类只能有一个实例。它提供了实例的全局访问点。
生成器模式(生成器
Pattern)将复杂对象的构造与表示分离,这样就可以根据程序的需要创建不同的表示。
原型模式(原型
Pattern)是先实例化一个类,然后复制或克隆该类创建一个新的实例,可以通过常用的方法进一步修改。
简单工厂
简单模式根据提供给他的数据返回几个可能的类的一个实例。通常,他返回的类有一个共同的父类和一个共同的方法,但每个方法执行不同的任务。
而且是根据不同的数据进行优化,简单共产模型实际上并不属于23GoF模型。
为了理解简单的共产主义模型,让我们看看下面的图片。在这个图中,X是一个基类,由其派生出XY类和XZ类,XFactory类根据给定的参数决定返回哪个子类。
右边定义了一个getClass方法,给他传递一个值比如(abc),然后放回X类的一个实例中,返回哪个类实例与程序员无关,
因为这些类的方法是一样的,只是实现不一样。返回哪个类的权力完全取决于工厂。工厂函数可能很复杂,但通常非常简单。
让我们看一个例子。
假设我们有一个表单,表单顶部的输入框只允许您输入名字和姓氏。使用,分隔姓和名。
首先,构建一个基类
命名者
使用系统;
2
3命名空间名称工厂
4 {
5 ///摘要
6 ///
命名者的摘要描述。
7////摘要
8//基数
获取拆分名称的类
9公共类命名器{
10//件
储存在这里
11受保护的字符串frName,lName
12
13//返回
西方人名的第一个字
14公共字符串getFrname(){
15返回frName
16 }
17//返回
姓
18公共字符串getLname() {
19返回lName
20 }
21 }
22 }
派生两个子类,然后写两个简单的派生类,实现接口,在构造函数里把名字分成两部分。
在第一节课。我做了一个简单的假设:最后一个巴掌大的空格前面的所有部分都属于姓‘first name’
使用系统;
2
3命名空间名称工厂
4 {
5 ///摘要
6 ///
FirstFirst的摘要说明。
7////摘要
8公共类FirstFirst : Namer
9 {
10 public FirstFirst(字符串名称)
11 {
12 int i=name。index of(“”);
13 if(i 0) {
14 frName=name。子链
(0,I)。trim();
15 lName=名称。子链
(i 1)。trim();
16 }
17其他{
18 lName=name
19 frName=“”;
20 }
21 }
22 }
23 }
在lastfirst,class中,用逗号分隔lastname。当空格逗号不存在时,两个类都提供错误处理。
1使用系统;
2
3命名空间名称工厂
4 {
5 ///摘要
6 ///
LastFirst的摘要说明。
7////摘要
8公共类LastFirst : Namer
9 {
10 public LastFirst(字符串名称){
11 int i=name。IndexOf(,);
12 if(i 0) {
13 lName=名称。子链
(0,I);
14 frName=name。子链
(i 1)。trim();
15 }
16其他{
17 lName=name
18 frName=“”;
19 }
20 }
21 }
22 }
工厂
1使用系统;
2
3命名空间名称工厂
4 {
5 ///摘要
6 ///的摘要说明
NameFactory。
7////摘要
8公共类名Factory {
9 public NameFactory() {}
10
11公共命名器getName(字符串名称){
12 int i=name。IndexOf(,);
13如果(i 0)
14返回新的last first(name);
其他15个
16返回新FirstFirst(名称);
17 }
18 }
19 }
使用工厂
1命名者nm=
nameFact.getName (txName。正文);
2 txFirst。Text=nm.getFrname
();
3 txLast。文本=
nm . getlname();
简单工厂有相同的方法类。
实例,可以是不同派生子类的实例,也可以是实际上没有任何关系但共享同一个接口的类。不管形式如何,这些类实例中的方法必须相同。