抽象工厂设计模式
时间:2011-03-04 来源:宝多
这里的示例出自:http://blog.csdn.net/MONKEY_D_MENG/archive/2010/07/01/5707076.aspx。引用的是《大话设计模式》这本书的例子。
并且工厂模式与抽象工厂模式之间的区别也是通过其它文章了解的。只不过是把自己所理解的东西写出来而己。如果看到这些文章的朋友,发现了错误,希望您能告诉我一下。但希望不要
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
//用户实体类public class User
{
private int id;
private String name;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
//Department实体类。
public class Department
{
private int id;
private String name;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
//抽象产品类 //这里抽象产品类包括两个,一个是对User的操作,另一个是对IDepartment的操作。 public interface IUser
{
void insert(User user);
User getUser(int id);
}
public interface IDepartment
{
void insert(Department department);
Department getDepartment(int id);
}
//SQL ServerUser操作类.
//实现IUser接口
public class SqlServerUser : IUser
{
public void insert(User user)
{
Console.Write("在SQL Server中给User表增加一条记录");
}
public User getUser(int id)
{
Console.Write("在SQL Server中根据ID得到User表一条记录");
return null;
}
}
//Access操作类
//实现IUser接口
public class AccessUser : IUser
{
public void insert(User user)
{
Console.Write("在Access中给User表增加一条记录");
}
public User getUser(int id)
{
Console.Write("在Access中根据ID得到User表一条记录");
return null;
}
}
//SqlServer操作类 //实现IDepartment接口 public class SqlServerDepartment : IDepartment
{
public void insert(Department department)
{
Console.Write("在SQL Server中给Department表增加一条记录");
}
Department getDepartment(int id)
{
Console.Write("在SQL Server中根据ID得到Department表一条记录");
}
}
//Access操作类 //实现Idepartment接口
public class AccessDepartment : IDepartment
{
public void insert(Department department)
{
Console.Write("在Access中给Department表增加一条记录");
}
public Department getDepartment(int id)
{
Console.Write("在Access中根据ID得到Department表一条记录");
}
}
//抽象工厂类,主要负责分别生成sqlserver和access操作对象。 public class DataAccess
{
private static final String db = "Sqlserver";
public static IUser createUser()
{
Iuser result = null;
if ("Sqlserver".equals(db))
{
result = new SqlServerUser();
} else if ("Access".equals(db))
{
result = new AccessUser();
}
return result;
}
public static IDepartment createDepartment()
{
IDepartment result = null;
if ("Sqlserver".equals(db))
{
result = new SqlServerDepartment();
} else if ("Access".equals(db))
{
result = new AccessDepartment();
}
return result;
}
}
//客户端代码
public class Main
{
public static void main(String[] args)
{
User user = new User();
Department department = new Department();
//直接调用抽象工厂类,创建多个具体产品类的实例。(IUser和IDepartment) IUser iu = DataAccess.createUser();
iu.insert(user);
iu.getUser(1);
IDepartment id = DataAccess.createDepartment();
id.insert(department);
id.getDepartment(1);
}
}
抽象工厂模式与工厂模式的区别。
工厂设计模式:
一个抽象产品类,可以派生出多个具体产品
(如IUser这个抽象产品,可以派生出Accesss及SQLServer两种,即一个抽象产品可以派生出多个具体产品)
每个具体工厂类只能创建一个具体产品类的实例
(本例如果使用工厂模式,需要定义SqlFactory以及AccessFactory两个工厂以及一个抽象工厂Factory,如果只有IUser表时,只能通过SqlFactory创建一个iuser对象,这种方法即为工厂模式。
但现在这里边存在两个对象Iuser以及IDepartment(一系列对象),并且SQL和Access又可以看成是两大不同的分类,所以使用抽象工厂模式)
抽工厂模式
多个抽象产品类,可以派生出多个具体产品
每个具体工厂类可以创建多个具体产品类的实例
可以想像另一种举例
现在比如说有一个生产鼠标以及健盘的厂家,如果想生成不同的产品,即是生成鼠标还是只生成健盘,可以使用工厂模式,这里只有具体对象的区别,而没有厂家的区别。
(这里的思想是,在客户端指定是生成鼠标还是生成健盘,鼠标与健盘继承同一个接口)
如果想在不同厂家之间进行切换,如生成联想的健盘鼠标套装,或者是生成其它厂家的健盘鼠标套装,就应该使用抽象工厂模式。
(而这里应该分别定义鼠标与键盘生产的接口,在根据抽象工厂生成具体是联想品牌还是其它厂家的品牌对象)
对于抽象工厂模式以及工厂模式之间的区别,自己不是很清楚。现在只是通过看其它人的文章得到的学习结果。以后如果发现不对的地方,会慢慢改进的。
在学习的过程中出现错误不怕,但一定要及时发现并改正,才是最终的学习目标.