• 工厂模式,装饰模式(新手)


    工厂模式

    什么是工厂设计模式?

    之前我们创建类对象是,都是使用new对象的形式创建,在很多业务场景下也提供了不直接new的方式

    工厂模式(Factory  Pattern) 是java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

    工厂设计模式的作用

    工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入

    可以实现类与类之间的解耦合操作(核心思想)

    1. package 工厂模式;
    2. /**
    3. * 手机类
    4. */
    5. public abstract class Phone {
    6. private String name;//手机品牌
    7. private double price;//价格
    8. public abstract void start();
    9. /**
    10. * @return the name
    11. */
    12. public String getName() {
    13. return name;
    14. }
    15. /**
    16. * @param name the name to set
    17. */
    18. public void setName(String name) {
    19. this.name = name;
    20. }
    21. /**
    22. * @return the price
    23. */
    24. public double getPrice() {
    25. return price;
    26. }
    27. /**
    28. * @param price the price to set
    29. */
    30. public void setPrice(double price) {
    31. this.price = price;
    32. }
    33. public Phone(String name, double price) {
    34. super();
    35. this.name = name;
    36. this.price = price;
    37. }
    38. public Phone() {
    39. super();
    40. }
    41. }
    1. package 工厂模式;
    2. public class Iphone extends Phone {
    3. @Override
    4. public void start() {
    5. // TODO Auto-generated method stub
    6. System.out.println(super.getName()+"手机启动了");
    7. }
    8. }
    1. package 工厂模式;
    2. public class HuaWei extends Phone{
    3. @Override
    4. public void start() {
    5. // TODO Auto-generated method stub
    6. System.out.println(super.getName()+"手机很快的启动了");
    7. }
    8. }

    创建一个工厂

    1. package 工厂模式;
    2. public class PhoneFactory {
    3. public static Phone creatPhone (String name) {
    4. switch (name) {
    5. case "huawei":
    6. Phone h1=new HuaWei();
    7. h1.setName("华为");
    8. h1.setPrice(5999);;
    9. return h1;
    10. case"iPhone":
    11. Phone p1=new Iphone();
    12. p1.setName("苹果");
    13. p1.setPrice(9999);
    14. return p1;
    15. default:
    16. return null;
    17. }
    18. }
    19. }

    测试对象

    1. package 工厂模式;
    2. public class Test {
    3. public static void main(String[] args) {
    4. // TODO Auto-generated method stub
    5. Phone p1=PhoneFactory.creatPhone("iPhone");
    6. p1.start();//苹果启动了
    7. }
    8. }

    装饰模式

    什么是装饰设计模式?

    创建一个新类,包装原始类,从而在新类中提升原来类的功能

    装饰设计模式的作用?

    装饰模式指的是不改变原来类的基础上,动态地扩展一个类的功能

    例如:

    InputStream(抽象父类)

    FileInputStream(实现子类,读写性能较差)

    BufferedInputStream(实现子类,装饰类,读写性能搞)

    定义父类

    定义原始类,继承父类,定义功能

    定义装饰类,继承父类,包装原始类,增强功能

    做一个模拟

    1. package 装饰模式;
    2. /**
    3. * 共同的抽象父类
    4. */
    5. public abstract class ComFather {
    6. public abstract String read(String s);
    7. public abstract String read(byte[] buffer);
    8. }

    原始管道

    1. package 装饰模式;
    2. import java.util.Arrays;
    3. /**
    4. *原始类
    5. */
    6. public class Original extends ComFather {
    7. @Override
    8. public String read(String s) {
    9. System.out.println("我是原始管道,读的很慢我读了"+s);
    10. return null;
    11. }
    12. @Override
    13. public String read(byte[] buffer) {
    14. System.out.println("我是原始管道,读取字节数组:"+Arrays.toString(buffer));
    15. return null;
    16. }
    17. }

    装饰管道

    1. package 装饰模式;
    2. /**
    3. * 原始功能升级版
    4. */
    5. public class Pro extends ComFather {
    6. private ComFather org;
    7. public Pro(ComFather org) {
    8. this.org=org;
    9. }
    10. @Override
    11. public String read(String s) {
    12. System.out.println("装饰管道已经为你加强!");
    13. return org.read(s);
    14. }
    15. @Override
    16. public String read(byte[] buffer) {
    17. System.out.println("装饰管道已经为你加强,更快的读字节数组把");
    18. return org.read(buffer);
    19. }
    20. }

    测试一下

    1. package 装饰模式;
    2. public class Test {
    3. public static void main(String[] args) {
    4. ComFather c=new Original();
    5. c.read("666");//原始管道读
    6. Pro p=new Pro(c);
    7. p.read("000000000000");
    8. }
    9. }

    最后输出

    我是原始管道,读的很慢我读了666
    装饰管道已经为你加强!
    我是原始管道,读的很慢我读了000000000000
     

  • 相关阅读:
    【算法刷题】—7.30DP动态规划的应用
    java【毕业设计】项目-第118期基于SpringBoot+LayUI的视频播放网站(权限采用SpringSecurity)-计算机毕业设计
    RabbitMQ:work结构
    【LeetCode】88. 合并两个有序数组 - Go 语言题解
    exit(0),exit(1),exit(EXIT_SUCCESS),exit(EXIT_FAILURE)
    C# 将HTML转为XML
    springboot封装查询快递物流
    Spring学习|使用Spring实现AOP,三种方式:原生Spring API接口、自定义类、注解方式
    【踩坑】PyTorch中指定GPU不生效和GPU编号不一致问题
    从不同视角理解架构
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/126071252