定义
抽象工厂模式又称Kit模式,是对工厂方法模式的一个升级,它提供了一个创建一系列或相关相互依赖对象的接口,而无需指定它们的具体的类。而它与工厂方法模式的区别是,工厂方法模式只是围绕一个产品来说,而抽象工厂模式是针对多个产品,也就是少和多的区别。
结构
Factory:抽象工厂。声明生成抽象产品的方法。
ConcreteFactory:具体工厂。定义生成抽象产品的具体方法,生成一个具体的产品。
Product:抽象产品:为一种产品声明接口。
ConcreteProduct:具体产品。定义具体工厂生成的具体产品对象,实现抽象产品接口。
情形
家兴用工厂方法模式去实现项目经理的要求,项目经理很满意;继续交一个任务给家兴:由于公司最近发展得非常不错,公司资金非常充足,为了改善公司的数据库系统,公司将原来的数据库的mysql的连接方式改db2的连接方式,由于mysql和oracle其中有写sql并不一样;家兴想了想,在想不新增加的代码不能违背开闭原则,接口隔离原则,单一职责原则等等,不能再改接口ShotTechnology,使得这一接口变得复杂,功能变得复杂。于是家兴用抽象工厂模式。
抽象工厂模式的XML图
代码
//接口
public interface Mind {
ShotMysql getShotMysql();
ShotOracle getShotOracle();
}
public interface ShotMysql{
public void method();
}
public interface ShotOracle{
public void method();
}
//具体工厂
public class DryPickMind implements Mind {
/* (non-Javadoc)
* @see com.yatming.model.abstartFactory#getDryPickMysql()
*/
@Override
public ShotMysql getDryPickMysql() {
// TODO Auto-generated method stub
return new DryPickMysql();
}
/* (non-Javadoc)
* @see com.yatming.model.abstartFactory#getDryPickOracle()
*/
@Override
public ShotOracle getDryPickOracle() {
// TODO Auto-generated method stub
return new DryPickOracle();
}
}
public class ScramMind implements Mind {
/* (non-Javadoc)
* @see com.yatming.model.abstartFactory#getScramMysql()
*/
@Override
public ShotMysql getScramMysql() {
// TODO Auto-generated method stub
return new ScramMysql();
}
/* (non-Javadoc)
* @see com.yatming.model.abstartFactory#getScramOracle()
*/
@Override
public ShotOracle getScramOracle () {
// TODO Auto-generated method stub
return new ScramOracle ();
}
}
//实现ShotMysql接口
public class DryPickMysql implements ShotMysql{
public void method() {
// TODO Auto-generated method stub
System.out.println("我家兴要用mysql式的干拔了,看招");
}
}
public class ScramMysql implements ShotMysql{
public void method() {
// TODO Auto-generated method stub
System.out.println("我家兴要用mysql式的急停了,看招");
}
}
//实现ShotOracle接口
public class DryPickOracle implements ShotOracle{
public void method() {
// TODO Auto-generated method stub
System.out.println("我家兴要用oracle式的干拔了,看招");
}
}
public class ScramOracle implements ShotOracle{
public void method() {
// TODO Auto-generated method stub
System.out.println("我家兴要用oracle式的急停了,看招");
}
}