• 二十三种设计模式之工厂模式(含Java工厂模式的实现)


    前言

    工厂模式的核心本质就是减少了我们去new对象这样子的操作,工厂模式可以分为三种,简单工厂模式工厂方法模式抽象工厂模式

    • 简单工厂模式

    简单工厂模式本质上是违背开闭原则的,简单工厂模式把实例化的操作放到统一一个类里面,让这个类去决定创建哪种对象

    • 工厂方法模式

    工厂方法模式我觉得就是在简单工厂模式上加了一层,这样就能保证开闭原则了

    • 抽象工厂模式

    抽象工厂模式其实就是工厂的工厂,也就是一个超级工厂,他提供了一个抽象的工厂接口,他是所有工厂一般化的一种形态

    传统模式

    假如我们有一个饼干类,顾客想要买饼干,但是饼干有很多种,比如巧克力饼干,夹心饼干,压缩饼干等等

    代码实现

    1. //客户类
    2. public class client {
    3. public static void main(String[] args) {
    4. //买一个巧克力饼干
    5. Cookie cookie = new ChocolateCookies();
    6. cookie.eatCookie();
    7. //买一个夹心饼干
    8. cookie = new CompressedCookie();
    9. cookie.eatCookie();
    10. //买一个压缩饼干
    11. cookie = new SandwichCookie();
    12. cookie.eatCookie();
    13. }
    14. }
    15. //公共饼干接口
    16. public interface Cookie {
    17. public void name();
    18. public void eatCookie();
    19. }
    20. //夹心饼干实现
    21. public class SandwichCookie implements Cookie{
    22. @Override
    23. public void name() {
    24. System.out.println("夹心饼干");
    25. }
    26. @Override
    27. public void eatCookie() {
    28. System.out.println("吃掉夹心曲奇");
    29. }
    30. }
    31. //压缩饼干实现
    32. public class CompressedCookie implements Cookie{
    33. @Override
    34. public void name() {
    35. System.out.println("压缩饼干");
    36. }
    37. @Override
    38. public void eatCookie() {
    39. System.out.println("吃掉压缩饼干");
    40. }
    41. }
    42. //巧克力饼干实现
    43. public class ChocolateCookies implements Cookie{
    44. @Override
    45. public void name() {
    46. System.out.println("巧克力饼干");
    47. }
    48. @Override
    49. public void eatCookie() {
    50. System.out.println("吃掉巧克力饼干");
    51. }
    52. }
    53. //吃掉巧克力饼干
    54. //吃掉压缩饼干
    55. //吃掉夹心曲奇
    56. 复制代码

    简单工厂模式

    我们可以看到在我们的Client类里面,我们多次使用了new,去生成不同的饼干,我们可以使用简单工厂模式去优化我们的代码,其实就是我们有一个饼干工厂,我们每次去买饼干都是从工厂中拿的。

    为什么说简单工厂模式不符合开闭原则呢?

    在简单工厂模式中,就比如上图,我还要加一个草莓饼干,这个时候,我们需要修改饼干工厂的代码,所以不符合开闭原则。

    代码实现

    这里只把饼干工厂类的代码放在这里,饼干的实现类并没有改变

    1. //客户类
    2. public class client {
    3. public static void main(String[] args) {
    4. Cookie cookie = CookieFactory.getCookie("巧克力");
    5. cookie.eatCookie();
    6. cookie = CookieFactory.getCookie("夹心");
    7. cookie.eatCookie();
    8. cookie = CookieFactory.getCookie("压缩");
    9. cookie.eatCookie();
    10. }
    11. }
    12. //饼干工厂类
    13. public class CookieFactory {
    14. public static Cookie getCookie(String cookieName){
    15. if("巧克力".equals(cookieName)){
    16. return new ChocolateCookies();
    17. }else if("夹心".equals(cookieName)){
    18. return new SandwichCookie();
    19. }else if("压缩".equals(cookieName)){
    20. return new CompressedCookie();
    21. }else{
    22. return null;
    23. }
    24. }
    25. }
    26. //吃掉巧克力饼干
    27. //吃掉夹心曲奇
    28. //吃掉压缩饼干
    29. 复制代码

    工厂方法模式

    其实我觉得工厂方法模式就是在简单工厂模式加了一层,这样就符合了开闭原则

    代码实现

    我们可以看到工厂方法模式的代码十分冗余,虽然他符合了开闭原则,但是我们在日常开发中很少使用它。

    1. //客户类
    2. public class client {
    3. public static void main(String[] args) {
    4. Cookie cookie = new ChocolateFacotry().getCookie();
    5. cookie.eatCookie();
    6. cookie = new SandwichFactory().getCookie();
    7. cookie.eatCookie();
    8. cookie = new CompressedFactory().getCookie();
    9. cookie.eatCookie();
    10. }
    11. }
    12. //饼干工厂
    13. public interface FacotryMehtod {
    14. Cookie getCookie();
    15. }
    16. //夹心饼干工厂
    17. public class SandwichFactory implements FacotryMehtod{
    18. @Override
    19. public Cookie getCookie() {
    20. return new SandwichCookie();
    21. }
    22. }
    23. //压缩饼干工厂
    24. public class CompressedFactory implements FacotryMehtod{
    25. @Override
    26. public Cookie getCookie() {
    27. return new CompressedCookie();
    28. }
    29. }
    30. //巧克力饼干工厂
    31. public class ChocolateFacotry implements FacotryMehtod{
    32. @Override
    33. public Cookie getCookie() {
    34. return new ChocolateCookies();
    35. }
    36. }
    37. 复制代码

    抽象工厂模式

    对于抽象工厂模式,是一种一般化工厂的一种形态,就比如,联想的工厂肯定不仅仅只生产电脑,小米的工厂也不仅仅只生产电脑,他肯定还有其他的,其实我觉得抽象工厂模式更像是一种产品族的概念

    就像这种,我们的抽象工厂只提供一些基本工厂的一些形态

    代码实现

    1. //客户类
    2. public class client {
    3. public static void main(String[] args) {
    4. PhoneProduct phone = new XiaomiFactory().getPhoneProduct();//从小米工厂买手机
    5. phone.SendSMS();
    6. phone.callUp();
    7. PhoneProduct phone2 = new LianXiangFactory().getPhoneProduct();//从联想工厂买手机
    8. phone2.SendSMS();
    9. phone2.callUp();
    10. ComputerProduct computer = new XiaomiFactory().getComputerProduct();//从小米工厂买电脑
    11. computer.work();
    12. computer.game();
    13. ComputerProduct computer2 = new LianXiangFactory().getComputerProduct();//从联想工厂买电脑
    14. computer2.work();
    15. computer2.game();
    16. }
    17. }
    18. //统一工厂
    19. public interface abstractFactory {
    20. PhoneProduct getPhoneProduct();
    21. ComputerProduct getComputerProduct();
    22. }
    23. //联想工厂
    24. public class LianXiangFactory implements abstractFactory{
    25. @Override
    26. public PhoneProduct getPhoneProduct() {
    27. return new LianXiangPhone();
    28. }
    29. @Override
    30. public ComputerProduct getComputerProduct() {
    31. return new LianXiangComputer();
    32. }
    33. }
    34. //小米工厂
    35. public class XiaomiFactory implements abstractFactory{
    36. @Override
    37. public PhoneProduct getPhoneProduct() {
    38. return new XiaomiPhone();
    39. }
    40. @Override
    41. public ComputerProduct getComputerProduct() {
    42. return new XiaomiComputer();
    43. }
    44. }
    45. //统一电脑接口
    46. public interface ComputerProduct {
    47. void work();
    48. void game();
    49. }
    50. //统一手机接口
    51. public interface PhoneProduct {
    52. void callUp();
    53. void SendSMS();
    54. }
    55. //联想电脑
    56. public class LianXiangComputer implements ComputerProduct{
    57. @Override
    58. public void work() {
    59. System.out.println("使用联想电脑办公");
    60. }
    61. @Override
    62. public void game() {
    63. System.out.println("使用联想电脑玩游戏");
    64. }
    65. }
    66. //联想手机
    67. public class LianXiangPhone implements PhoneProduct{
    68. @Override
    69. public void callUp() {
    70. System.out.println("使用联想手机打电话");
    71. }
    72. @Override
    73. public void SendSMS() {
    74. System.out.println("使用联想手机发短信");
    75. }
    76. }
    77. //小米电脑
    78. public class XiaomiComputer implements ComputerProduct{
    79. @Override
    80. public void work() {
    81. System.out.println("使用小米电脑办公");
    82. }
    83. @Override
    84. public void game() {
    85. System.out.println("使用小米电脑玩游戏");
    86. }
    87. }
    88. //小米手机
    89. public class XiaomiPhone implements PhoneProduct{
    90. @Override
    91. public void callUp() {
    92. System.out.println("使用小米手机打电话");
    93. }
    94. @Override
    95. public void SendSMS() {
    96. System.out.println("使用小米手机发短信");
    97. }
    98. }
    99. //使用小米手机发短信
    100. //使用小米手机打电话
    101. //使用联想手机发短信
    102. //使用联想手机打电话
    103. //使用小米电脑办公
    104. //使用小米电脑玩游戏
    105. //使用联想电脑办公
    106. //使用联想电脑玩游戏
    107. 复制代码

    总结

    对于工厂模式,我们了解了三种工厂模式的实现,以及与传统模式的不同,我们可以看到的是,除了简单工厂模式,另外两种工厂模式代码十分的冗余,所以在实际的开发中,我们也是很少使用的,虽然简单工厂模式他并不满足开闭原则,但是他实现起来更方便呀,相较于传统模式,我们也不用去new一个又一个对象了,所以简单工厂模式在实际的开发用的是比较多的!

  • 相关阅读:
    Ansible入门
    nginx--指令
    Python读取Excel工作表数据写入CSV、XML、文本
    【python】ModuleNotFoundError: No module named ‘skimage‘...
    做好自己安全第一责任人 嘀嗒全面上线安全带智能语音提醒
    详解三次握手与四次挥手及相关面试题回答
    【matplotlib 实战】--百分比柱状图
    外汇天眼:什么是熊市和牛市?
    Day739.GEO经纬度数据结构&自定义数据结构 -Redis 核心技术与实战
    3.搭建增长模型-数据洞察
  • 原文地址:https://blog.csdn.net/weixin_45985053/article/details/126304986