一、 定义
抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二、 结构图
抽象工厂模式的抽象工厂类可以使用一个抽象类来实现,通过反射(依赖注入)和配置等方式,使代码面对需求变化时,改动最少。
三、 示例代码(以数据库访问为例)
package org.example.abstractfactory;
public class User {
private String name="";
public User(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package org.example.abstractfactory;
public class Department {
private String department="";
public Department(String department){
this.department = department;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
package org.example.abstractfactory;
public interface IUser {
public void Insert(User user);
public User getUser();
}
package org.example.abstractfactory;
public interface IDepartment {
public void Insert(Department department);
public Department getDepartment();
}
package org.example.abstractfactory;
public interface IFactory {
public IUser CreateUserFactory();
public IDepartment CreateDepartmentFactory();
}
package org.example.abstractfactory;
public class MysqlUser implements IUser{
@Override
public void Insert(User user) {
System.out.println("user = " + user.getName());
}
@Override
public User getUser() {
return null;
}
}
package org.example.abstractfactory;
public class MysqlDepartment implements IDepartment {
@Override
public void Insert(Department department) {
System.out.println("department = " + department.getDepartment());
}
@Override
public Department getDepartment() {
return null;
}
}
package org.example.abstractfactory;
public class MysqlFactory implements IFactory{
@Override
public IUser CreateUserFactory() {
return new MysqlUser();
}
@Override
public IDepartment CreateDepartmentFactory() {
return new MysqlDepartment();
}
}
package org.example.abstractfactory;
public class OracalUser implements IUser {
@Override
public void Insert(User user) {
System.out.println("user = " + user.getName());
}
@Override
public User getUser() {
return null;
}
}
package org.example.abstractfactory;
public class OracalDepartment implements IDepartment{
@Override
public void Insert(Department department) {
System.out.println("department = " + department.getDepartment());
}
@Override
public Department getDepartment() {
return null;
}
}
package org.example.abstractfactory;
public class OracalFactory implements IFactory{
@Override
public IUser CreateUserFactory() {
return new MysqlUser();
}
@Override
public IDepartment CreateDepartmentFactory() {
return new MysqlDepartment();
}
}
package org.example.abstractfactory;
public class Client {
public static void main(String[] args) {
User u = new User("lily");
Department d = new Department("tec");
IFactory mf = new MysqlFactory();
IUser iu = mf.CreateUserFactory();
IDepartment id = mf.CreateDepartmentFactory();
iu.Insert(u);
id.Insert(d);
}
}