• 抽象工厂模式


    之前学习过了简单工厂模式和工厂方法模式:这两个的区别其实就是在创建具体实例的时候,是放到一个工厂类下,还是分成多个工厂类,解决的问题就是遵循开放-关闭原则。今天要讲的是抽象工厂模式

    解释:抽象工厂模式其实就是在工厂模式的基础上增加了需要实例化的抽象类

     

    场景:对于数据使用不同类型的存储工具,mysql,sql-server,oracle,access

    抽象工厂模式:

    1. package factory.simplefactory;
    2. public class ChangeSql {
    3. public static void main(String[] args) {
    4. ModelFactory modelFactory = new MySqlModelFactory();
    5. DepModel depModel = modelFactory.createDepModel();
    6. depModel.insert();
    7. depModel.delete();
    8. /**
    9. * 使用mysql插入一个部门
    10. * 使用mysql删除一个部门
    11. */
    12. }
    13. }
    14. abstract class ModelFactory {
    15. public abstract UserModel createUserModel();
    16. public abstract DepModel createDepModel();
    17. }
    18. class MySqlModelFactory extends ModelFactory{
    19. public UserModel createUserModel() {
    20. return new UserModelMysql();
    21. }
    22. public DepModel createDepModel() {
    23. return new DepModelMysql();
    24. }
    25. }
    26. class AccessModelFactory extends ModelFactory{
    27. public UserModel createUserModel() {
    28. return new UserModelAccess();
    29. }
    30. public DepModel createDepModel() {
    31. return new DepModelAccess();
    32. }
    33. }
    34. abstract class UserModel {
    35. public abstract void insert();
    36. public abstract void delete();
    37. }
    38. class UserModelAccess extends UserModel {
    39. public void insert() {
    40. System.out.println("使用access插入一个用户");
    41. }
    42. public void delete() {
    43. System.out.println("使用access删除一个用户");
    44. }
    45. }
    46. class UserModelMysql extends UserModel {
    47. public void insert() {
    48. System.out.println("使用mysql插入一个用户");
    49. }
    50. public void delete() {
    51. System.out.println("使用mysql删除一个用户");
    52. }
    53. }
    54. abstract class DepModel {
    55. public abstract void insert();
    56. public abstract void delete();
    57. }
    58. class DepModelAccess extends DepModel {
    59. public void insert() {
    60. System.out.println("使用access插入一个部门");
    61. }
    62. public void delete() {
    63. System.out.println("使用access删除一个部门");
    64. }
    65. }
    66. class DepModelMysql extends DepModel {
    67. public void insert() {
    68. System.out.println("使用mysql插入一个部门");
    69. }
    70. public void delete() {
    71. System.out.println("使用mysql删除一个部门");
    72. }
    73. }

    简单工厂+抽象工厂+反射+配置文件

    1. package factory.abstractfactory;
    2. public class ChangeSql {
    3. public static void main(String[] args) throws Exception {
    4. //可以自行从配置文件中获取
    5. String sql = "Access";
    6. ModelFactory modelFactory = new ModelFactory();
    7. UserModel userModel = modelFactory.createUserModel(sql);
    8. userModel.insert();
    9. userModel.delete();
    10. /**
    11. * 使用access插入一个用户
    12. * 使用access删除一个用户
    13. */
    14. }
    15. }
    16. class ModelFactory {
    17. public UserModel createUserModel(String sql) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    18. UserModel userModel = (UserModel) Class.forName("factory.abstractfactory.UserModel" + sql).newInstance();
    19. return userModel;
    20. }
    21. public DepModel createDepModel(String sql) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    22. DepModel depModel = (DepModel) Class.forName("factory.abstractfactory.DepModel" + sql).newInstance();
    23. return depModel;
    24. }
    25. }
    26. abstract class UserModel {
    27. public abstract void insert();
    28. public abstract void delete();
    29. }
    30. class UserModelAccess extends UserModel {
    31. public void insert() {
    32. System.out.println("使用access插入一个用户");
    33. }
    34. public void delete() {
    35. System.out.println("使用access删除一个用户");
    36. }
    37. }
    38. class UserModelMysql extends UserModel {
    39. public void insert() {
    40. System.out.println("使用mysql插入一个用户");
    41. }
    42. public void delete() {
    43. System.out.println("使用mysql删除一个用户");
    44. }
    45. }
    46. abstract class DepModel {
    47. public abstract void insert();
    48. public abstract void delete();
    49. }
    50. class DepModelAccess extends DepModel {
    51. public void insert() {
    52. System.out.println("使用access插入一个部门");
    53. }
    54. public void delete() {
    55. System.out.println("使用access删除一个部门");
    56. }
    57. }
    58. class DepModelMysql extends DepModel {
    59. public void insert() {
    60. System.out.println("使用mysql插入一个部门");
    61. }
    62. public void delete() {
    63. System.out.println("使用mysql删除一个部门");
    64. }
    65. }

  • 相关阅读:
    华为云 CodeArts Snap 智能编程助手 PyCharm 插件安装与使用指南
    kube-proxy参数ClusterCIDR做什么
    荷兰量子生态联盟投资110万欧元开发超导量子处理器
    PLC数据采集网关是如何应用的?-天拓四方
    【Linux】 ubuntu内存清理
    【开关稳压器】LMR16030SDDA、LMR38010FDDAR,汽车类LMR43610MSC5RPERQ1低 EMI 同步降压稳压器
    Java毕业设计-基于springboot开发的网上租赁系统设计与实现-毕业论文(附毕设源代码)
    【Java面试】Spring中 BeanFactory和FactoryBean的区别
    【Python+Appium】开展自动化测试(一)
    Linux系统下安装RabbitMQ超简单教程(非详细)(Centos8)
  • 原文地址:https://blog.csdn.net/xf552527/article/details/128197050