一、定义
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类,让子类决定具体实例化哪一个类。
此模式的第一个好处是,易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
另一个好处是,它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。
二、UML类图
三、实现
- 抽象工厂类
package com.jthao.design.des.abstractfactory;
public interface IFactory {
IUser createUser();
IDept createDept();
}
- 具体工厂类A
package com.jthao.design.des.abstractfactory;
public class MysqlFactory implements IFactory {
@Override
public IUser createUser() {
return new MysqlUser();
}
@Override
public IDept createDept() {
return new MysqlDept();
}
}
- 具体工厂类B
package com.jthao.design.des.abstractfactory;
public class OracleFactory implements IFactory {
@Override
public IUser createUser() {
return new OracleUser();
}
@Override
public IDept createDept() {
return new OracleDept();
}
}
- 第一个对象接口类
package com.jthao.design.des.abstractfactory;
public interface IUser {
void insertUser();
void getUser();
}
- 第一个对象实现类A
package com.jthao.design.des.abstractfactory;
public class MysqlUser implements IUser {
@Override
public void insertUser() {
System.out.println("MysqlUser insertUser");
}
@Override
public void getUser() {
System.out.println("MysqlUser getUser");
}
}
- 第一个对象实现类B
package com.jthao.design.des.abstractfactory;
public class OracleUser implements IUser {
@Override
public void insertUser() {
System.out.println("OracleUser insertUser");
}
@Override
public void getUser() {
System.out.println("OracleUser getUser");
}
}
- 第二个对象接口类
package com.jthao.design.des.abstractfactory;
public interface IDept {
void insertDept();
void getDept();
}
- 第二个对象实现类A
package com.jthao.design.des.abstractfactory;
public class MysqlDept implements IDept {
@Override
public void insertDept() {
System.out.println("MysqlDept insertDept");
}
@Override
public void getDept() {
System.out.println("MysqlDept getDept");
}
}
- 第二个对象实现类B
package com.jthao.design.des.abstractfactory;
public class OracleDept implements IDept {
@Override
public void insertDept() {
System.out.println("OracleDept insertDept");
}
@Override
public void getDept() {
System.out.println("OracleDept getDept");
}
}
- 测试类
package com.jthao.design.des.abstractfactory;
public class Test {
public static void main(String[] args) {
IFactory factory = new OracleFactory();
IUser user = factory.createUser();
IDept dept = factory.createDept();
user.insertUser();
user.getUser();
dept.insertDept();
dept.getDept();
System.out.println("================");
factory = new MysqlFactory();
user = factory.createUser();
dept = factory.createDept();
user.insertUser();
user.getUser();
dept.insertDept();
dept.getDept();
}
}