3.23类设计模式的Java版-Abstract Factory(抽象工厂)
3.23种设计模式的Java版--Abstract Factory(抽象工厂)
抽象工厂模式主要是基于需要不同实现,切换实现方便。例如一个CMS,数据库的存储用Hibernate、TopLink实现,默认的使用 Hibernate工厂,在Hibernate工厂中生成的实例都是Hibernte实现;在使用Oracle数据库的时候为了效率改用TopLink工厂(据说TopLink在Oracle中效率高,没有测试过,也不知道 TopLink开发团队是否比Hibernte团队水平高),TopLink工厂中生成的实例都是TopLink实现。而切换它们只需要修改抽象工厂的实现便可。
抽象模式的实现步骤:
1.定义抽象工厂类
2.定义抽象工厂的实现类
每个抽象工厂的实现类可以有多个对象的生成,而这多个对象是有一定关联的。如上面举的例子中,在Hibernate工厂中生成的实例都是Hibernte实现,TopLink工厂中生成的实例都是TopLink实现。
package com.tao.pattern.abstractFactory; public abstract class AbstractFactory { /** * 生成用户数据库操作类实例 * * @return */ public abstract UserDAO createUserDAO(); /** * 生成角色数据库操作类实例 * * @return */ public abstract RoleDAO createRoleDAO(); }
package com.tao.pattern.abstractFactory; public class HibernateFactory extends AbstractFactory { @Override public RoleDAO createRoleDAO() { return new RoleDAOImplHibernate(); } @Override public UserDAO createUserDAO() { return new UserDAOImplHibernate(); } }
package com.tao.pattern.abstractFactory; public class TopLinkFactory extends AbstractFactory { @Override public RoleDAO createRoleDAO() { return new RoleDAOImplTopLink(); } @Override public UserDAO createUserDAO() { return new UserDAOImplTopLink(); } }
package com.tao.pattern.abstractFactory; public interface RoleDAO { // 角色数据库操作 void save(); }
package com.tao.pattern.abstractFactory; public class RoleDAOImplHibernate implements RoleDAO { @Override public void save() { System.out.println("RoleDAOImplHibernate save!"); } }
package com.tao.pattern.abstractFactory; public class RoleDAOImplTopLink implements RoleDAO { @Override public void save() { System.out.println("RoleDAOImplTopLink save!"); } }
public interface UserDAO { void save(); }
package com.tao.pattern.abstractFactory; public class UserDAOImplHibernate implements UserDAO { @Override public void save() { System.out.println("UserDAOImplHibernate save!"); } }
package com.tao.pattern.abstractFactory; public class UserDAOImplTopLink implements UserDAO { @Override public void save() { System.out.println("UserDAOImplTopLink save!"); } }