- 定义;提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类。
- 概述:
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构
-
组成
抽象工厂接口
抽象产品
具体工厂
具体产品 -
问题:当面对不同的数据库比如Access ,Sqlserver 等不同我们怎么处理我们的数据库访问层,做到开放封闭的原则
-
具体代码:
/**抽象工厂接口*/
public interface IFactory {
public IUser Create();
}
/**具体工厂 Access数据库*/
public class AccessFactory implements IFactory{
public IUser Create() {
return new AccessUser();
}
}
/**具体工厂SqlServer*/
public class SqlServerFactory implements IFactory{
public IUser Create() {
return new SqlServerUser();
}
}
/**抽象产品 操作 添加和更新*/
public interface IUser {
void Insert();
void update();
}
/**具体产品*/
public class AccessUser implements IUser{
public void Insert() {
System. out.println("AccessUser ... Insert");
}
public void update() {
System. out.println("AccessUser ... update");
}
}
/**具体产品*/
public class SqlServerUser implements IUser{
public void Insert() {
System. out.println("SqlServerUser ... Insert");
}
public void update() {
System. out.println("SqlServerUser ... update");
}
}
public class SqlIntace {
/** 人生是一种修行,不光修的是人生阅历,更是修的一颗心*/
//通过反射更加灵活
public static IFactory creFactory(String className) throws Exception{
return (IFactory) Class.forName(className ).newInstance();
}
}
/**上层调用*/
IFactory creFactory = SqlIntace.creFactory("com.test.abstratefactory.AccessFactory");
IUser create2 = creFactory.Create();
create2.update();
- 整体结构图
由此可见,我们用抽象工厂可以很好解决对以后需求的数据库的变化而代码做到最少的修改和影响、有比较好的扩展性,但同时我们也看到也有不好的一面,每次我们都要写单独的实现工厂的接口和抽象产品的接口,
-
优点:
1、抽象工厂模式隔离了具体类的生产
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。 -
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。