抽象工厂模式:提供一个创建一系列相关对象的接口,而无需指定具体的类。工厂方法模式解决了简单工厂模式工厂类责任过重的问题,但是由于工厂方法模式只创建一类具体类的对象,会导致系统中工厂类过多,会增加系统开销。所以我们要考虑将一些相关的具体类组成一个“具体类族”,由一个工厂统一生产

    优点:
    便于交换产品系列,可以轻松改变产品配置

    实现:
    假设系统中用的是MySql数据库,众所周知,MySql的语法和Oracle语法有很多差别,如果语句是写死在系统中,甲方要求将MySql替换成Oracle,那么系统中所有的关联的地方都要改。如果我们使用工厂方法,则只用替换对应的抽象工厂类即可

    1、抽象数据库表(产品)

    1. /**
    2. * 部门表
    3. */
    4. public abstract class IDept {
    5. /**
    6. * 创建部门
    7. */
    8. public abstract void createDept();
    9. }
    10. /**
    11. * 用户表
    12. */
    13. public abstract class IUser {
    14. /**
    15. * 创建用户信息
    16. */
    17. public abstract void createUser();
    18. }

    2、MySql数据库表

    1. /**
    2. * MySql部门
    3. */
    4. public class MySqlDept extends IDept{
    5. public void createDept(){
    6. System.out.println("MySql创建部门");
    7. }
    8. }
    9. /**
    10. * MySql用户
    11. */
    12. public class MySqlUser extends IUser{
    13. /**
    14. * 创建用户信息
    15. */
    16. public void createUser(){
    17. System.out.println("MySql创建用户");
    18. }
    19. }

    3、Oracle数据库表

    1. /**
    2. * Oracle部门
    3. */
    4. public class OracleDept extends IDept{
    5. public void createDept(){
    6. System.out.println("Oracle创建部门");
    7. }
    8. }
    9. /**
    10. * Oracle用户
    11. */
    12. public class OracleUser extends IUser{
    13. /**
    14. * 创建用户信息
    15. */
    16. public void createUser(){
    17. System.out.println("Oracle创建用户");
    18. }
    19. }

    3、抽象工厂

    1. /**
    2. * 抽象工厂
    3. */
    4. public abstract class IFactory {
    5. /**
    6. * 创建用户信息
    7. */
    8. public abstract void createUser();
    9. /**
    10. * 创建部门
    11. */
    12. public abstract void createDept();
    13. }
    14. /**
    15. * MySql工厂
    16. */
    17. public class MySqlFactory extends IFactory{
    18. /**
    19. * 创建MySql用户
    20. */
    21. public void createUser(){
    22. new MySqlUser().createUser();
    23. }
    24. /**
    25. * 创建MySql部门
    26. */
    27. public void createDept(){
    28. new MySqlDept().createDept();
    29. }
    30. }
    31. /**
    32. * Oracle工厂
    33. */
    34. public class OracleFactory extends IFactory{
    35. /**
    36. * 创建Oracle用户
    37. */
    38. public void createUser(){
    39. new OracleUser().createUser();
    40. }
    41. /**
    42. * 创建Oracle部门
    43. */
    44. public void createDept(){
    45. new OracleDept().createDept();
    46. }
    47. }

    4、测试

    1. /**
    2. * 测试抽象工厂模式
    3. */
    4. public class TestAbstracFactory {
    5. public static void main(String [] args){
    6. IFactory factory = new OracleFactory();
    7. factory.createUser();
    8. factory.createDept();
    9. }
    10. }

    测试结果:
    image.png

    对比抽象工厂模式和工厂方法模式的区别在于,工厂方法模式只创建一个具体类对象,而抽象工厂模式,是用于创建一组相关的类的对象。