C#学习笔记-抽象工厂模式
题目1:数据访问,通过数据库对用户表单的进行访问,数据库包含SQL Server,对用户表单进行“新增用户”和“查询用户”信息等操作。
分析:
首先,确认用户表单,里面包含两个ID和Name两个字段,两种字段可以读写功能;
单独准备一个数据库的类,然后直接对用户直接进行操作即可。
实现:
using System; namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
//向su数据库中添加user这个新的用户
User user = new User();
// bug:不能更换数据库的原因是su这个数据库已经被框死在了SQL Server上
SqlserverUser su = new SqlserverUser();
su.Insert(user); //在su的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = su.GetUser(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
} /// <summary>
/// 用于操作User表
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
}
题目2:在1的基础上,我们增加新的数据库Access,同样对刚才的数据库进行访问。
分析:
基于1的基础上,SqlserverUser su = new SqlserverUser();将数据库的对象定死在了SQL Server上了,这就出现了很大的局限性。
为了将SQL与Access灵活使用,我们就需要用到工厂方法模式来封装数据库,让子类决定实例化哪一个类。
实现:
using System; namespace 抽象工厂模式2
{
class Program
{
static void Main(string[] args)
{
//向iu数据库中添加user这个新的用户
User user = new User();
IFactory factory = new SqlServerFactory(); //若要更改成Access数据库 将SqlServerFactory换成AccessFactory即可
IUser iu = factory.CreateUser();
iu.Insert(user); //在iu的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = iu.GetUser(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
} interface IUser
{
void Insert(User user);
User GetUser(int id);
} /// <summary>
/// 用于访问SQL Server的User
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser:IUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
/// <summary>
/// 用户访问Access的User
/// </summary>
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
} public void Insert(User user)
{
Console.WriteLine("在Access中给User增加一条记录");
}
}
/// <summary>
/// 接口
/// 定义了一个创建访问User表对象的抽象的工厂接口
/// </summary>
interface IFactory
{
//因为sql和access都继承于IUser,所以返回值设定为IUser即可
IUser CreateUser();
}
/// <summary>
/// 实现IFactory接口,实例化SqlserverUser
/// </summary>
class SqlServerFactory : IFactory
{
public IUser CreateUser()
{
return new SqlserverUser();
}
}
/// <summary>
/// 实现IFactory接口,实例化AccessUser
/// </summary>
class AccessFactory : IFactory
{
public IUser CreateUser()
{
return new AccessUser();
}
}
}
题目3:在2是我基础上,我们再增加一个信息表,例如Department表来记录信息。
分析:
这里Department与User是一样信息,所以和Department的构造与User类似,再同时修改工厂类及其子类信息即可。
这里需要使用的就是抽象工厂模式(Abstract Factory),提供一个 创建一系列相关或者互相依赖对象的接口,而无需指定他们具体的类。
实现:
using System; namespace 抽象工厂模式3
{
class Program
{
static void Main(string[] args)
{
//向iu数据库中添加user这个新的用户
User user = new User();
IFactory factory = new AccessFactory();
IUser iu = factory.CreateUser();
iu.Insert(user); //在iu的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = iu.GetUser(); //向id数据库中添加dept这个新的用户
Department dept = new Department();
IDepartment id = factory.CreateDepartment();
id.Insert(dept); //在id的数据库中查找unknownDept这个用户
Department unknownDept = new Department();
unknownDept = id.GetDepartment(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 增加一个Department表
/// </summary>
class Department
{
private int _id;
private string _deptName; public int Id
{
get { return _id; }
set { _id = value; }
} public string DeptName
{
get { return _deptName; }
set { _deptName = value; }
}
} interface IUser
{
void Insert(User user);
User GetUser(int id);
} /// <summary>
/// 用于访问SQL Server的User
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser : IUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
/// <summary>
/// 用户访问Access的User
/// </summary>
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
} public void Insert(User user)
{
Console.WriteLine("在Access中给User增加一条记录");
}
} /// <summary>
/// 与User表一致
/// </summary>
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
class SqlserverDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在SQL server中给Department增加一条记录");
}
}
class AccessDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在Access中给Department增加一条记录");
} } /// <summary>
/// 接口
/// 定义了一个创建访问User表对象的抽象的工厂接口
/// </summary>
interface IFactory
{
//因为sql和access都继承于IUser,所以返回值设定为IUser即可
IUser CreateUser();
IDepartment CreateDepartment();
}
/// <summary>
/// 实现IFactory接口,实例化SqlserverUser
/// </summary>
class SqlServerFactory : IFactory
{
public IDepartment CreateDepartment()
{
return new SqlserverDepartment();
} public IUser CreateUser()
{
return new SqlserverUser();
} }
/// <summary>
/// 实现IFactory接口,实例化AccessUser
/// </summary>
class AccessFactory : IFactory
{
public IDepartment CreateDepartment()
{
return new AccessDepartment();
} public IUser CreateUser()
{
return new AccessUser();
}
}
}
题目4:在3中我们可以得知,如果增加一个信息表Project,就意味着需要增加信息表本身的三个类:IProject、SqlserverProject、AccessProject,同时还需要更改Ifactory、SqlserverFactory和AccessFactory才可以完全实现,那么如果我有100个调用数据库访问的类,工作量将变得巨大。
分析:
信息表本身的类是无法删减的,所以我们只有从工厂类来入手,我们将IFactory、SqlserverFactory和AccessFactory三个工厂类去除,用一个DataAccess类来代替,简化代码。
实现:
using System; namespace 抽象工厂模式4
{
class Program
{
static void Main(string[] args)
{
//向iu数据库中添加user这个新的用户
User user = new User();
IUser iu = DataAccess.CreateUser(); //直接得到实际的数据库访问实例,不存在任何依赖
iu.Insert(user); //在iu的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = iu.GetUser(); //向id数据库中添加dept这个新的用户
Department dept = new Department();
IDepartment id = DataAccess.CreateDepartment();
id.Insert(dept); //在id的数据库中查找unknownDept这个用户
Department unknownDept = new Department();
unknownDept = id.GetDepartment(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 增加一个Department表
/// </summary>
class Department
{
private int _id;
private string _deptName; public int Id
{
get { return _id; }
set { _id = value; }
} public string DeptName
{
get { return _deptName; }
set { _deptName = value; }
}
} interface IUser
{
void Insert(User user);
User GetUser(int id);
} /// <summary>
/// 用于访问SQL Server的User
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser : IUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
/// <summary>
/// 用户访问Access的User
/// </summary>
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
} public void Insert(User user)
{
Console.WriteLine("在Access中给User增加一条记录");
}
} /// <summary>
/// 与User表一致
/// </summary>
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
class SqlserverDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在SQL server中给Department增加一条记录");
}
}
class AccessDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在Access中给Department增加一条记录");
} } 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 AccessUser();
break;
}
return result;
}
public static IDepartment CreateDepartment()
{
IDepartment result = null;
switch (db)
{
case "Sqlserver":
result = new SqlserverDepartment();
break;
case "Access":
result = new AccessDepartment();
break;
}
return result;
}
}
}
题目5:从4中我们可以看出简单工厂的方法就不需要输入参数,这样在客户端就只需要db的值,客户端没有出现任何一个SQL或者Access的字样,达到了解耦的目的,但是同时的问题也出现了,如果我增加了数据库,例如Oracle的数据库访问,那么就需要在DataAccess类中每个方法的switch中加case。
分析:
在实例化的过程中我们不难发现:如果是Sqlserver就会去实例化SQL Server数据库相关类,如果是Access就去实例化Access相关类,对应的数据库类可以通过字符串得出来,所以我们可以用到“反射”这种方法:Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
实现:
using System;
using System.Reflection;//反射 namespace 抽象工厂模式5
{
class Program
{
static void Main(string[] args)
{
//向iu数据库中添加user这个新的用户
User user = new User();
IUser iu = DataAccess.CreateUser(); //直接得到实际的数据库访问实例,不存在任何依赖
iu.Insert(user); //在iu的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = iu.GetUser(); //向id数据库中添加dept这个新的用户
Department dept = new Department();
IDepartment id = DataAccess.CreateDepartment();
id.Insert(dept); //在id的数据库中查找unknownDept这个用户
Department unknownDept = new Department();
unknownDept = id.GetDepartment(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 增加一个Department表
/// </summary>
class Department
{
private int _id;
private string _deptName; public int Id
{
get { return _id; }
set { _id = value; }
} public string DeptName
{
get { return _deptName; }
set { _deptName = value; }
}
} interface IUser
{
void Insert(User user);
User GetUser(int id);
} /// <summary>
/// 用于访问SQL Server的User
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser : IUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
/// <summary>
/// 用户访问Access的User
/// </summary>
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
} public void Insert(User user)
{
Console.WriteLine("在Access中给User增加一条记录");
}
} /// <summary>
/// 与User表一致
/// </summary>
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
class SqlserverDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在SQL server中给Department增加一条记录");
}
}
class AccessDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在Access中给Department增加一条记录");
} } class DataAccess
{
//在此确定需要使用的数据库信息
private static readonly string AssemblyName = "抽象工厂模式5";
private static readonly string db = "Sqlserver";
//private static readonly string db = "Access"; public static IUser CreateUser()
{
string className = AssemblyName + "." + db + "User";
//Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public static IDepartment CreateDepartment()
{
string className = AssemblyName + "." + db + "Department";
return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
}
题目6:在5的基础上,我们只有一点遗憾了:更换数据库访问时,我们还是需要去修改程序,也就是db这个字符串的值
分析:
我们可以利用配置文件来更改DataAccess的信息了,这样就不用去程序中修改了。

实现:
using System;
using System.Reflection;//反射
using System.Configuration; namespace 抽象工厂模式6
{
class Program
{
static void Main(string[] args)
{
//向iu数据库中添加user这个新的用户
User user = new User();
IUser iu = DataAccess.CreateUser(); //直接得到实际的数据库访问实例,不存在任何依赖
iu.Insert(user); //在iu的数据库中查找unknownUser这个用户
User unknownUser = new User();
unknownUser = iu.GetUser(); //向id数据库中添加dept这个新的用户
Department dept = new Department();
IDepartment id = DataAccess.CreateDepartment();
id.Insert(dept); //在id的数据库中查找unknownDept这个用户
Department unknownDept = new Department();
unknownDept = id.GetDepartment(); Console.Read();
}
} /// <summary>
/// 用户类
/// 准备ID和Name两个字段
/// </summary>
class User
{
private int _id;
private string _name; public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 增加一个Department表
/// </summary>
class Department
{
private int _id;
private string _deptName; public int Id
{
get { return _id; }
set { _id = value; }
} public string DeptName
{
get { return _deptName; }
set { _deptName = value; }
}
} interface IUser
{
void Insert(User user);
User GetUser(int id);
} /// <summary>
/// 用于访问SQL Server的User
/// “增加用户”和“得到用户”两种方法
/// </summary>
class SqlserverUser : IUser
{
/// <summary>
/// 增加用户信息
/// </summary>
/// <param name="user">新的用户信息</param>
public void Insert(User user)
{
Console.WriteLine("在SQL server中给User增加一条记录");
}
/// <summary>
/// 得到用户方法
/// </summary>
/// <param name="id">(传入信息)通过用户的id值</param>
/// <returns>(返回信息)通过id值得到对应的用户数据</returns>
public User GetUser(int id)
{
Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
/// <summary>
/// 用户访问Access的User
/// </summary>
class AccessUser : IUser
{
public User GetUser(int id)
{
Console.WriteLine("在Access中根据ID得到User表一条记录");
return null;
} public void Insert(User user)
{
Console.WriteLine("在Access中给User增加一条记录");
}
} /// <summary>
/// 与User表一致
/// </summary>
interface IDepartment
{
void Insert(Department department);
Department GetDepartment(int id);
}
class SqlserverDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在SQL server中给Department增加一条记录");
}
}
class AccessDepartment : IDepartment
{
public Department GetDepartment(int id)
{
Console.WriteLine("在Access中根据ID得到Department表一条记录");
return null;
} public void Insert(Department department)
{
Console.WriteLine("在Access中给Department增加一条记录");
} } class DataAccess
{
//在此确定需要使用的数据库信息
private static readonly string AssemblyName = "抽象工厂模式6";
//app.config是配置文件,是标准的XML文件
//我们常常访问的是appSettings,它是由.NET预定义配置的
private static readonly string db = ConfigurationSettings.AppSettings["DB"]; public static IUser CreateUser()
{
string className = AssemblyName + "." + db + "User";
//Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")
return (IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public static IDepartment CreateDepartment()
{
string className = AssemblyName + "." + db + "Department";
return (IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
} /**
* 用简单工厂的地方,可以考虑用反射技术来去除switch或者if,接触分支判断来带的耦合
*/
}
总结:
抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的具体的类。
抽象工厂模式让具体的创建实例过程与客户端分离。
注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。
C#学习笔记-抽象工厂模式的更多相关文章
- 学习笔记——抽象工厂模式Abstract Factory
在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂. 依然以<真菌世界>游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- Java设计模式学习记录-抽象工厂模式
前言 上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上. 抽象工厂模式 抽象工厂模式是围绕着一个超级工厂创建其他工厂.这个超 ...
- 设计模式之笔记--抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- 设计模式 笔记 抽象工厂模式 Abstract Factory
//---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- 【设计模式】抽象工厂模式(Abstract Factory Pattern)
[前言] 上次针对自己的理解书写一篇工厂模式的文章,后面对于工厂模式进行更加多的学习,于是了解到了抽象工厂模式.其实网上大多数人们都是抽象工厂模式是工厂模式的升级版本,虽然我并不知道所说的升级是什么意 ...
- java23种设计模式(二)抽象工厂模式
我们接着上一章的工厂方法模式继续学习一下抽象工厂模式. 抽象工厂模式:在工厂模式中,如果有多个产品,则就是抽象工厂模式. 例子: 有一个工厂开了两个子公司,专门用来生产电脑配件键盘和鼠标,一个是联想工 ...
随机推荐
- (转)JVM工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java ...
- VUE-CLI Vue安装及开发,npm run build无法查看项目的问题
Vue-cli 本地安装vue项目 需要安装node.js,用node命令行npm的方式安装Vue 步骤: 1.进入项目地址安装 npm install vue-cli -g 2.初始化一下 ESli ...
- Linux Centos安装及卸载Apache
一.卸载 1.查看有没有安装apache,出现下面信息则安装过 [root@localhost ~]# rpm -qa|grep httpd httpd-2.2.15-53.el6.centos.x8 ...
- 【CSS3】定位
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- iOS 获取当前应用的信息以及用户信息:版本号手机号手机型号
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; CFShow(infoDictionary); // ap ...
- 回顾2017系列篇(一):最佳的11篇UI/UX设计文章
2017已经接近尾声,在这一年中,设计领域发生了诸多变化.也是时候对2017年做一个总结,本文主要是从2017设计文章入手,列出了个人认为2017设计行业里最重要的UI/UX文章的前11名,供大家参考 ...
- 程序员的自我救赎---1.4.1:核心框架讲解(DAL)
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- BeanShell断言(一)
在beanShell中直接可以调用的变量,无需加前缀. 1.log 打印日志 log.info(“在控制台打印日志”); 2.SampleResult 获取SampleResult对象,可以通过这个对 ...
- mysql zip 版安装
http://jingyan.baidu.com/article/8cdccae946133f315513cd6a.html
- K:正则表达式之进阶
子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...