定义 抽象工厂模式又称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式的急停了,看招"); } }