工厂模式被分成三个:简单工厂模式,抽象工厂模式和工厂模式。

定义:

简单工厂模式:用一个单独的类来做创造实例的过程。

工厂模式:一个用于创建对象的接口。让子类决定实例化哪一个类,讲一个类的实例化

延迟到其子类。

抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定详细类。

结构图:

这是简单工厂的结构图,从图中就非常好理解。

简单工厂的长处:

依据用户须要,new出须要的对象。

可是简单工厂弊端:

当新增加一个功能是。就要改动工厂。

这个时候,就须要工厂模式了。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU0MDEwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

从图中我们能够看出:

工厂模式客服了改动工厂类,运用扩展,加一个算法工厂,即可了。

工厂模式的有点:典型的解耦和模式。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDU0MDEwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这个就是抽象工厂。最核心的思想就是:抽象出接口类和抽象类。实现化不同的子类。

使用场景:

在数据库訪问中,在SQLserver中有User和Department两张表,在Access中也有相同的

相同的两张表,如今。须要向不同的数据库中代码訪问User表,进行加入数据和查询数据的方法。

分析:

如何做到最高效率的在SQLServer和Access中进行转换时我们须要考虑的。

第1版代码:不加怎样模式

    class User
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
class SqlserverUser
{
public void Insert(User user)
{ Console.WriteLine("在SQL Server中给User表加入一条记录"); }
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中依据ID得到User表一条记录");
return null;
}
}

client:

    class Program
{
static void Main(string[] args)
{
User user = new User();
SqlserverUser su = new SqlserverUser();
su.Insert(user);
su.GetUser(1);
Console.Read();
}
}

从代码中我们能够看到,假设我们须要从Access数据库中訪问User,则要加入类。改动client的代码将SqlserverUser su=new SqlserverUser();这句代码改为SqlAccessUser ac=new SqlAccessUser();这样写就违反了开闭原则。

第2版代码:工厂方法模式的数据訪问程序

接口层

    interface IFactory//工厂接口,与调用者交互
{
IUser CreateUser();
}
interface IUser//产品接口,定义产品的规范,全部的产品实现都必须遵循产品接口定义规范。
{
void Insert(User user);
User GetUser(int id);
}

上面是两个接口。上面有他们的结构图,一目了然。

工厂接口是工厂方法模式的核心。与调用者直接交互用来提供产品。

产品接口是定义产品的规范,全部的产品实现都必须遵循产品接口定义的规范。

产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。

实现:

    class SqlserverUser : IUser//产品实现。实现产品接口的详细类,决定了产品在client中的详细行为。
{
public void Insert(User user)
{
Console.WriteLine("在SQL Server中给User表添加一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在SQL Server依据ID得到User表一条记录");
return null;
}
}
class SqlAccessUser : IUser
{
public void Insert(User user)
{
Console.WriteLine("在Access中给User表加入一条记录");
}
public User GetUser(int id)
{
Console.WriteLine("在Access中依据ID得到User表一条记录");
return null;
}
}
class SqlserverFactory : IFactory//工厂实现,工厂实现决定怎样实例化产品。是实现拓展的途径。须要多少中产品,就要有多少个详细的工厂实现。
{
public IUser CreateUser()
{
return new SqlserverUser();
}
}
class SqlAccessFactory : IFactory
{
public IUser CreateUser()
{
return new SqlAccessUser();
}
}

工厂的实现:工厂实现决定怎样实例化产品,是实现拓展的途径。须要有多少中产品,就须要有多少个详细的工厂实现。

client:

    class Program
{
static void Main(string[] args)
{
User user = new User();//实例化实体
IFactory factory = new SqlserverFactory();//实现工厂类 IUser iu = factory.CreateUser();//工厂中创造出想要的对象
iu.Insert(user);
iu.GetUser(1); Console.Read(); }
}

若要訪问Department表。设计到2维操作,我们须要用到抽象工厂:

这里事实上非常easy。就是加一个Department接口,两个子类继承,加一个实体类,改动工厂类。

因为代码千篇一律,怕大家看烦了。就不晒了。

第3版:抽象模式加简单工厂模式:

结构图:

    class DataAccess
{
//private static readonly string db = "Sqlserver";
private static readonly string db = "Access";
public static IUser CreateUser()
{
IUser result = null;//一定是父类
switch (db)
{
case "Sqlserver":
result = new SqlserverUser();
break;
case "Access":
result = new SqlAccessUser();
break;
}
return result;
}
public static IDeparment CreateDep()
{
IDeparment result = null;
switch (db)
{
case "Sqlserver":
result = new SqlserverDeparment();
break;
case "Access":
result = new SqlAccessDepartment();
break; }
return result;
}
}

client:

    class Program
{
static void Main(string[] args)
{
User user = new User();
Department dep = new Department();
IUser iu = DataAccess.CreateUser();//创造实例化的子类 iu.Insert(user);
iu.GetUser(1); IDeparment dept = DataAccess.CreateDep(); dept.Insert(dep);
dept.GetDep(1); Console.Read(); }
}

以上就是场景分析。

长处:

简单工厂、工厂、抽象工厂是层层递进的关系,可是都存在这有点和缺点,我都在里面说了。所以。这里仅简介一下抽象工厂的长处:

第一:易于交换产品系列,在一个应用中值须要再初始化的时候。出现一次,这就是的改变一个应用的详细工厂变得很easy,他仅仅须要改变详细工厂就可以使用不同的产品配置。

第二:让详细的创建实例过程与client分离。client是通过他们的抽象接口操纵实例,产品的详细类名也被详细工厂的实现分离,不会出如今客户代码中。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

说谎的简单工厂模式设计模式&工厂方法模式&Abstract Factory模式的更多相关文章

  1. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  2. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  3. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  4. 设计模式初学者笔记:Abstract Factory模式

    首先啰嗦下创建迷宫所用的Room类.这个类并不直接保存Room四周的构造,而是通过MapSite* _sides[4]这个私有数组成员指向Room四周的构造.那么什么时候将四周构造直接放在Room中, ...

  5. Abstract Factory模式的几个要点

    1.如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式.这时候使用简单的静态工厂完全可以.2.“系列对象”指的是这些对象之间有相互依赖.或作用的关系3.Abs ...

  6. 简单工厂,Factory Method(工厂方法)和Abstract Factory(抽象工厂)模式

    对于简单工厂来说,它的工厂只能是这个样子的 public class SimplyFactory {  /** * 静态工厂方法 */ public static Prouct factory(Str ...

  7. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  8. 23设计模式(3):Abstract Factory模式

    定义:要创建一组相关或依赖对象提供一个接口,而你并不需要指定其具体类别. 类型:创建一个类模型 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者 ...

  9. 【设计模式】Abstract Factory模式

    抽象工厂模式是工厂方法模式的进一步强化.当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以. 可是.当用户程序须要创建多种类型的产品,而这些产品又有一定的内 ...

随机推荐

  1. php 下载服务器上存在的文件 到本地

    Header("Location: http://www.weiyunyi.com/Public/youbu_score_template.xls");

  2. python 升级pip

    废话少说,直接上图,希望谅解我的懒惰!:)

  3. 怎样把ul li 前面的点去掉

    在li 属性框里 放入 <li style="list-style-type:none;">...<li> 就可以了

  4. #import &lt;/usr/include/objc/objc-class.h&gt; not such file or directory问题的解决方法

    近期在使用一些开源的demo,打开后出现这个错误,然后能够把 #import </usr/include/objc/objc-class.h> 改动为以下 #import <objc ...

  5. CRT(C Runtime Library)—— C/C++运行时库

    C runtime library(part of the C standard library) 任何一个 C 程序,它的背后都有一套庞大的代码来进行支撑,使得该程序得以运行在更高级别上,而不必担心 ...

  6. Xmem

    http://blog.csdn.net/jthink_/article/details/43302615

  7. Apache DataFu: LinkedIn开源的Pig UDF库

    介绍 Apache DataFu分两部分,本文介绍的是其Pig UDF的部分.代码在Github上开源(除了代码外.也有一些slides介绍链接). DataFu里面是一些Pig的UDF.主要包含这些 ...

  8. Android 自定义View——自定义点击事件

    每个人手机上都有通讯录,这是毫无疑问的,我们通讯录上有一个控件,在通讯录的最左边有一列从”#”到”Z”的字母,我们通过滑动或点击指定的字母来确定联系人的位置,进而找到联系人.我们这一节就通过开发这个控 ...

  9. [经典面试题]k节点一组旋转链表

    [题目] 给出一个链表和一个数k,比方链表1→2→3→4→5→6.k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4.翻转后4→3→2→1→5→6. 假设节点的数 ...

  10. 5.3.3.1 deque其他使用方式

    在本节里提供了一些关于deque其他使用方式. 提供相似UNIX中的命令tail的功能,显示一个文件最后面一段文本: def tail(filename, n=10): '返回文件最后的n行文本' w ...