文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>抽象工厂设计模式

抽象工厂设计模式

时间: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又可以看成是两大不同的分类,所以使用抽象工厂模式)

   抽工厂模式

        多个抽象产品类,可以派生出多个具体产品

        每个具体工厂类可以创建多个具体产品类的实例

可以想像另一种举例

        现在比如说有一个生产鼠标以及健盘的厂家,如果想生成不同的产品,即是生成鼠标还是只生成健盘,可以使用工厂模式,这里只有具体对象的区别,而没有厂家的区别。

              (这里的思想是,在客户端指定是生成鼠标还是生成健盘,鼠标与健盘继承同一个接口)             

        如果想在不同厂家之间进行切换,如生成联想的健盘鼠标套装,或者是生成其它厂家的健盘鼠标套装,就应该使用抽象工厂模式。

             (而这里应该分别定义鼠标与键盘生产的接口,在根据抽象工厂生成具体是联想品牌还是其它厂家的品牌对象)

对于抽象工厂模式以及工厂模式之间的区别,自己不是很清楚。现在只是通过看其它人的文章得到的学习结果。以后如果发现不对的地方,会慢慢改进的。

在学习的过程中出现错误不怕,但一定要及时发现并改正,才是最终的学习目标.

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载