经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
JAVA笔记整理-Java设计模式
来源:cnblogs  作者:落雨??初晴  时间:2020/11/9 16:08:16  对本文有异议

一、设计模式概念

1、定义

? Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。

2、目的:

? 为了提高代码的可读性,可扩展性以及代码的复用性 ,为了解决在写代码过程中遇到的代码设计问题。

3、设计模式的六大原则

? 3.1 开闭原则: 对扩展开发,对修改关闭(尽可能对代码少修改)

? 3.2 里式替换原则: 它是面向对象基本原则之一,任何父类(基类)出现的地方,子类都可以出现,也就是子类可以替换父类的任何功能(体现了父类的可扩展性)

? 3.3 依赖倒转原则 : 尽可能面向接口编程, 依赖接口而不依赖类

? 3.4 接口隔离原则: 一个类如果能实现多个接口,尽可能实现多个 ,为了降低依赖,降低耦合

? 3.5 最少知道原则: 一个实体尽可能少的与其他实体产生相互关联关系,将实体的功能独立

? 3.6 合成复用原则: 尽量使用合成,聚合的方式,而不使用继承

4、设计模式的分类:

1、创建型模式(5个)

? 工厂方法模式、 抽象工厂模式、单例模式, 建造者模式,原型模式

2、结构型模式(7个)

? 适配器模式,装饰模式,代理模式,外观模式,桥接模式,享元模式,组合模式

3、行为型模式(11个)

? 策略模式,模板方法模式,观察者模式,迭代子模式 ,责任链模式,命令模式,状态模式,访问者模式,中介模式,解释器模式,备忘录模式

?

5、单例模式

单例模式是创建对象的一种特殊方式,程序从始至终都只创建一个对象叫单例(单实例)

分为两类

1、懒汉式单例

  1. public class Person {
  2. // 为了不让其他类直接访问该成员 懒汉式单例,在使用时创建对象
  3. // 1 私有静态变量
  4. private static Person person=null;
  5. //2、将构造器私有化
  6. private Person (){
  7. }
  8. //3 提供一个静态的方法,并可返回该类的对象
  9. public static Person getInstance(){
  10. if(person==null){ // 第一次访问
  11. person = new Person();
  12. }
  13. return person;
  14. }
  15. public void sayHello(){
  16. System.out.println("sayHello方法");
  17. }
  18. }

2、饿汉式单例

  1. public class Student {
  2. //1、 饿汉式单例模式, 在类加载时创建一个对象
  3. private static Student student = new Student();
  4. // 2 构造器私有化
  5. private Student(){
  6. }
  7. // 3 提供返回类对象的静态方法
  8. public static Student getInstance(){
  9. if(student !=null){
  10. return student;
  11. }
  12. return null;
  13. }
  14. }

6、工厂方法模式

? 创建对象的过程不再由当前类实例化,而是由工厂类完成 ,在工厂类中只需要告知 对象类型即可。 工厂模式中必须依赖接口

1、简单工厂模式

? 以生产 “电脑 ” 为例,电脑有办公的功能 , 可以生产一体机 或 笔记本

  1. 代码与静态工厂一样

? 2、静态工厂模式

  1. /**
  2. * 简单工厂模式
  3. * @param type
  4. * @return
  5. */
  6. //创建一体机与笔记本的共同接口 Computer
  7. public interface Computer {
  8. //创建方法work:电脑办公
  9. public void work();
  10. }
  11. //创建私人电脑类 PersonComputer 实现接口 Computer
  12. public class PersonComputer implements Computer{
  13. @Override //重写 实现接口方法
  14. public void work() {
  15. System.out.println("这是笔记本电脑,正在办公");
  16. }
  17. }
  18. //创建一体机类 workComputer 实现接口方法
  19. public class WorkComputer implements Computer{
  20. @Override //重写 实现接口方法
  21. public void work() {
  22. System.out.println("这是一体机正在办公");
  23. }
  24. }
  25. //创建工厂类 CompuerFactory
  26. public class ComputerFactory {
  27. /**
  28. * 根据不同的类型 生产不同的产品
  29. * @param type
  30. * @return
  31. */
  32. public Computer produce(String type){
  33. Computer computer =null; //定义一个空对象
  34. if(type.equals("personComputer")){ //判要断实现的对象
  35. computer = new PersonComputer(); //实现对象的赋值,获取要实现的对象
  36. }else if(type.equals("workComputer")){
  37. computer = new WorkComputer();
  38. }else{
  39. System.out.println("不能生产");
  40. }
  41. return computer; //返回获得的对象
  42. }
  43. /**
  44. * 静态工厂方法
  45. * @param type
  46. * @return
  47. */
  48. public static Computer produce(String type){
  49. // 定义一个接口的引用 通过接口new 一个实现类的对象
  50. // 提高扩展性
  51. Computer computer=null;
  52. if(type.equals("workComputer")){
  53. computer = new WorkComputer();
  54. }else if(type.equals("personComputer")){
  55. computer = new PersonComputer();
  56. }else{
  57. System.out.println("不能创建对象");
  58. }
  59. return computer;
  60. }
  61. }
  62. //测试实现 简单工厂模式与静态工厂方法
  63. public class Test1 {
  64. public static void main(String[] args) {
  65. // 通过工厂类创建对象
  66. ComputerFactory factory = new ComputerFactory();//通过工厂创建对象
  67. // 要对象 找工厂 (简单工厂模式)
  68. Computer computer1 = factory.produce("workComputer"); //通过工厂方法获取要调用的对象
  69. computer1.work(); //由返回获得的对象调用它的方法
  70. // 创建笔记本
  71. Computer computer2 = factory.produce("personComputer");
  72. computer2.work();
  73. //静态的方法调用,不需要通过工厂new对象来调用方法,可直接调用工厂方法获取要实现的对象 (静态工厂模式)
  74. Computer computer3 = ComputerFactory2.produce("workComputer");
  75. computer3.work();
  76. }
  77. }

? 3、工厂方法模式

  1. //创建BMWCar类与AudiCar类共同接口Car
  2. public interface Car {
  3. public void showInfo();
  4. }
  5. //创建AudiCar类
  6. public class AudiCar implements Car {
  7. @Override
  8. public void showInfo() {
  9. System.out.println("这是一台奥迪汽车。。");
  10. }
  11. }
  12. //创建BMWCar类
  13. public class BMWCar implements Car {
  14. @Override
  15. public void showInfo() {
  16. System.out.println("这是一台宝马汽车。");
  17. }
  18. }
  19. /**
  20. 生产汽车的工厂接口 CarFactory
  21. **/
  22. public interface CarFactory {
  23. public Car produce();
  24. }
  25. //创建工厂接口的实现类AudiCarFactory
  26. public class AudiCarFactory implements CarFactory {
  27. @Override
  28. public Car produce() {
  29. return new AudiCar();// 这里AudiCar是Car的实现类(要调用方法需要的对象);返回要调用的对象
  30. }
  31. }
  32. //创建工厂接口的实现类BMWCarFactory
  33. public class BMWCarFactory implements CarFactory {
  34. @Override
  35. public Car produce() {
  36. return new BMWCar();// 因为BWMCar是Car的实现类
  37. }
  38. }
  39. //测试
  40. public class Test1 {
  41. public static void main(String[] args) {
  42. //先创建 汽车工厂 对象
  43. CarFactory bmwFactory = new BMWCarFactory();
  44. // 通过工厂对象调用方法produce()来获取要调用的对象(返回值)
  45. Car bmw = bmwFactory.produce();
  46. bmw.showInfo(); //通过获取的对象调用它的方法
  47. //这个模式对于同一级别的产品,可扩展性高
  48. //可以扩展不同品牌的汽车,此时不需要修改代码,只需要增加代码即可
  49. // 创建一个新的品牌汽车 大众汽车
  50. CarFactory dazhongFactory = new DazhongCarFactory();
  51. Car car = dazhongFactory.produce();
  52. car.showInfo();
  53. }
  54. }

7、抽象工厂模式

? 对于在工厂方法的基础上,对同一个品牌的产品有不同的分类,并对分类产品创建的过程 ,一个汽车产品 会分为不同的种类(迷你汽车 , SUV汽车 )

  1. /**
  2. * 迷你汽车接口
  3. */
  4. public interface MiniCar {
  5. public void showInfo();
  6. }
  7. //SUV汽车接口
  8. public interface SUVCar {
  9. public void showInfo();
  10. }
  11. //迷你接口实现类(奥迪汽车:AudiMiniCar)
  12. public class AudiMiniCar implements MiniCar {
  13. @Override
  14. public void showInfo() {
  15. System.out.println("这是奥迪迷你汽车 ");
  16. }
  17. }
  18. //迷你接口实现类(宝马汽车:BMWMiniCar)
  19. public class BMWMiniCar implements MiniCar {
  20. @Override
  21. public void showInfo() {
  22. System.out.println("这是宝马Cooper迷你汽车");
  23. }
  24. }
  25. //SUV汽车接口实现类(奥迪汽车:AudiMiniCar)
  26. public class AudiSUVCar implements SUVCar {
  27. @Override
  28. public void showInfo() {
  29. System.out.println("这是一辆 奥迪SUV汽车");
  30. }
  31. }
  32. //SUV汽车接口实现类(宝马汽车:BMWMiniCar)
  33. public class BMWSUVCar implements SUVCar {
  34. @Override
  35. public void showInfo() {
  36. System.out.println("这宝马的SUV系列");
  37. }
  38. }
  1. //工厂接口
  2. public interface CarFactory {
  3. //生成不同型号的汽车 ,两条产品线
  4. public MiniCar produceMiniCar();
  5. public SUVCar produceSUVCar();
  6. }
  7. //工厂接口的实现类(奥迪汽车:AudiCarFactoryr)
  8. public class AudiCarFactory implements CarFactory {
  9. @Override
  10. public MiniCar produceMiniCar() { //迷你型汽车方法
  11. return new AudiMiniCar(); //返回对象AudiMiniCar()
  12. }
  13. @Override
  14. public SUVCar produceSUVCar() { //SUV型汽车方法
  15. return new AudiSUVCar(); //返回对象AudiMiniCar()
  16. }
  17. }
  18. //工厂接口的实现类(宝马汽车:BMWCarFactory)
  19. public class BMWCarFactory implements CarFactory {
  20. // 生成迷你汽车的方法,返回MiniCar
  21. @Override
  22. public MiniCar produceMiniCar() {//迷你型汽车方法
  23. return new BMWMiniCar(); //返回对象BMWMiniCar()
  24. }
  25. //生成SUV汽车的方法, 返回SUVCar
  26. @Override
  27. public SUVCar produceSUVCar() {//SUV型汽车方法
  28. return new BMWSUVCar(); //返回对象BMWMiniCar()
  29. }
  30. }
  31. //测试:
  32. public class Test1 {
  33. public static void main(String[] args) {
  34. //创建宝马迷你汽车 找工厂(创建工厂对象)
  35. CarFactory factory = new BMWCarFactory();
  36. MiniCar car = factory.produceMiniCar(); //通过工厂对象调用方法获取目标对象
  37. car.showInfo(); //通过获取的对象调用方法
  38. }
  39. }

总结: 对于简单工厂, 工厂方法模式和抽象工厂的区别和用途

1、对于简单工厂(静态和非静态),用于生产同一结构中的任意产品,对于新增产品不适用。

2、对于工厂方法,在简单工厂的基础上,生产同一个等级结构中的固定产品,可以支持新增产品。

3、抽象工厂: 用于生产不同种类(品牌)的相同类型(迷你,SUV) ,对于新增品牌可以,不支持新增类型。

8、模板方法

? 定义:

? 模板方法是一种行为模式,父类的一个方法定义完成这个方法的步骤,但不具体实现具体细节,由子类完成各个步骤的实现,在创建子类对象时,最终的实现过程是子类的方法。

? 模板方法的准备:

? 1、继承关系

? 2、父类是抽象类 :抽象类实现了模板方法,定义了算法的估计

3、子类继承抽象类:实现抽象方法,完成完整的算法

  1. public abstract class AbstractPerson {
  2. /**
  3. * 定义一个模板方法,用于实现这个方法的基本“骨架”
  4. * 每一步骤的具体实现由子类完成
  5. */
  6. public void preparedSchool(){
  7. getUp();
  8. dressing();
  9. eat();
  10. }
  11. //起床
  12. public abstract void getUp();
  13. //穿衣服
  14. public abstract void dressing();
  15. //吃早餐
  16. public abstract void eat();
  17. }
  1. public class Teacher extends AbstractPerson {
  2. @Override
  3. public void getUp() {
  4. System.out.println("老师起床,7点半起床");
  5. }
  6. @Override
  7. public void dressing() {
  8. System.out.println("老师要衣服得体,穿工装");
  9. }
  10. @Override
  11. public void eat() {
  12. System.out.println("老师吃早餐。");
  13. }
  14. }
  1. public class Test1 {
  2. public static void main(String[] args) {
  3. Student stu = new Student();//创建学生类对象
  4. stu.preparedSchool();
  5. Teacher teacher = new Teacher(); //创建老师类对象
  6. teacher.preparedSchool();
  7. }
  8. }

原文链接:http://www.cnblogs.com/z5452830/p/13810603.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号