您的位置:首页 > 其它

设计模式——抽象工厂模式

2016-07-18 09:54 148 查看
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

优点:

1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

角色:

 AbstractFactory(抽象工厂):声明一个接口,这个接口中包含创建抽象产品对象的方法。
ConcreteFactory(具体工厂):实现创建具体产品对象的方法。
AbstractProduct(抽象产品):声明一个接口,这个接口包含产品对象类型。
ConcreteProduct(具体产品):定义一个产品对象,这个产品对象是由相关的具体工厂创建的。

应用场景:

1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

2、系统中有多于一个的产品族,而每次只使用其中某一产品族。

3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。、

代码实现:
package com.sun.abstractfactory;
/**
* 抽象工厂
* @author work
*
*/
public interface IFactory {

public IUserService createUserService();
}

package com.sun.abstractfactory;
/**
* 抽象产品
* @author work
*
*/
public interface IUserService {

public void insert(User user);

public User getUser(int id);

}
package com.sun.abstractfactory;
/**
* 具体工厂mysql
* @author work
*
*/
public class MysqlFactory implements IFactory{

@Override
public IUserService createUserService() {
// TODO Auto-generated method stub
return new MysqlUser();
}

}
package com.sun.abstractfactory;
/**
* 具体产品mysql
* @author work
*
*/
public class MysqlUser implements IUserService{

@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("mysql");
}

@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("mysql........get.....");
User user = new User();
user.setId(1);
user.setName("xx");
return user;
}

}
package com.sun.abstractfactory;
/**
* 具体工厂sqlserver
* @author work
*
*/
public class SqlServerFactory implements IFactory{

@Override
public IUserService createUserService() {
// TODO Auto-generated method stub
return new SqlServerUser();
}

}
package com.sun.abstractfactory;
/**
* 具体产品sqlserver
* @author work
*
*/
public class SqlServerUser implements IUserService{

@Override
public void insert(User user) {
// TODO Auto-generated method stub
System.out.println("sqlserver");
}

@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("sqlserver........get.....");
User user = new User();
user.setId(1);
user.setName("xx");
return user;
}

}
package com.sun.abstractfactory;
/**
* 用户
* @author work
*
*/
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;
}

}
package com.sun.abstractfactory;

public class Test {
public static void main(String[] args) {
IFactory f = new MysqlFactory();
IUserService s = f.createUserService();
s.getUser(1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: