软件设计师——设计模式笔记上(创造型5种)

  • 设计模式的主要目的
  • 设计模式的原则
  • 1、工厂方法模式(类模式)
    • 意图
    • 适用性
    • 代码实现
  • 2、抽象工厂模式(对象模式)
    • 意图
    • 适用性
    • 代码实现
  • 3、生成器模式(对象模式)
    • 意图
    • 适用性
    • 代码实现
  • 4、原型模式(对象模式)
    • 意图
    • 适用性
    • 代码实现
  • 5、单例模式(对象模式)
    • 意图
    • 适用性
    • 代码实现

设计模式的主要目的

复用成功的设计

设计模式的原则

  1. 开闭原则
  2. 里氏代换原则
  3. 依赖倒转原则
  4. 接口隔离原则
  5. 迪米特法则
  6. 合成复用原则
  7. 单一职责原则

1、工厂方法模式(类模式)

意图

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。(子类决定实例化)

适用性

  1. 当一个类不知道它所必须创建的对象的类的时候。
  2. 当一个类希望由它的子类来指定它所创建的对象的时候。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

代码实现

//1 工厂方法模式
public class FactoryMethod {public static void main(String[] args) {Factory factoryA = new FactoryA();Product productA = factoryA.createProduct();productA.info();Factory factoryB = new FactoryB();Product productB = factoryB.createProduct();productB.info();}
}interface Factory {public Product createProduct();
}class FactoryA implements Factory {@Overridepublic Product createProduct() {return new ProductA();}
}class FactoryB implements Factory {@Overridepublic Product createProduct() {return new ProductB();}
}interface Product {public void info();
}class ProductA implements Product {@Overridepublic void info() {System.out.println("产品的信息:A");}
}class ProductB implements Product {@Overridepublic void info() {System.out.println("产品的信息:B");}
}

运行结果

产品的信息:A
产品的信息:B

2、抽象工厂模式(对象模式)

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(抽象接口)

适用性

  1. 一个系统要独立于它的产品的创建、组合和表示时。
  2. 一个系统要由多个产品系列中的一个来配置时。
  3. 当要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 当提供一个产品类库,只想显示它们的接口而不是实现时。

代码实现

//2 抽象工厂模式
public class AbstractFactory {public static void main(String[] args) {Factory factory1 = new Factory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.info();productB1.info();Factory factory2 = new Factory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.info();productB2.info();}
}interface Factory {public ProductA createProductA();public ProductB createProductB();
}//用工厂1来生产产品1类
class Factory1 implements Factory {@Overridepublic ProductA createProductA() {return new ProductA1();}@Overridepublic ProductB createProductB() {return new ProductB1();}
}//用工厂2来生产产品2类
class Factory2 implements Factory {@Overridepublic ProductA createProductA() {return new ProductA2();}@Overridepublic ProductB createProductB() {return new ProductB2();}
}interface ProductA {public void info();
}
//产品A分为产品A1类和产品A2类
class ProductA1 implements ProductA {@Overridepublic void info() {System.out.println("产品的信息:A1");}
}class ProductA2 implements ProductA {@Overridepublic void info() {System.out.println("产品的信息:A2");}
}interface ProductB {public void info();
}
//产品B分为产品B1类和产品B2类
class ProductB1 implements ProductB {@Overridepublic void info() {System.out.println("产品的信息:B1");}
}class ProductB2 implements ProductB {@Overridepublic void info() {System.out.println("产品的信息:B2");}
}

运行结果

产品的信息:A1
产品的信息:B1
产品的信息:A2
产品的信息:B2

3、生成器模式(对象模式)

意图

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(类和构造分离)

适用性

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2. 当构造过程必须允许被构造的对象有不同的表示时。

代码实现

//3 生成器模式
import java.util.*;public class Main {public static void main(String[] args) {Director director = new Director();Builder builder1 = new Builder1();//管理者创建了一个生成器1director.Construct(builder1); Product product1 = builder1.getResult();product1.show();Builder builder2 = new Builder2();//管理者创建了一个生成器2director.Construct(builder2);Product product2 = builder2.getResult();product2.show();}
}
//管理者
class Director {public void Construct(Builder builder) {builder.BuildPart();}
}
//生成器
abstract class Builder {public abstract void BuildPart();public abstract Product getResult();
}
//生成器1
class Builder1 extends Builder {Product product = new Product();@Overridepublic void BuildPart() {product.Add("A");product.Add("B");product.Add("C");product.Add("D");product.Add("E");product.Add("F");}@Overridepublic Product getResult() {return product;}
}
//生成器2
class Builder2 extends Builder {Product product = new Product();@Overridepublic void BuildPart() {product.Add("A");product.Add("B");product.Add("C");}@Overridepublic Product getResult() {return product;}
}
//产品管理
class Product {List<String> parts = new ArrayList<String>();//添加到列表public void Add(String part) {parts.add(part);}//显示public void show() {System.out.print("产品的组成:");for (String s : parts)System.out.print(s + " ");System.out.print("\n");}
}

运行结果

产品的组成:A B C D E F
产品的组成:A B C D

4、原型模式(对象模式)

意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。(原型实例,拷贝)

适用性

  1. 当一个系统应该独立于它的产品创建、构成和表示时。
  2. 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  3. 为了避免创建一个与产品类层次平行的工厂类层次时。
  4. 当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一 些。

代码实现

//4 原型模式
public class Main {public static void main(String[] args) {Day day1 = new Day(2001, 1.21);System.out.println("日期1" + day1.getYear() + " " + day1.getMonth());//day2克隆day1的参数Day day2 = (Day) day1.Clone();System.out.println("日期2" + day2.getYear() + " " + day2.getMonth());//day3克隆day1的参数Day day3 = (Day) day1.Clone();System.out.println("日期3" + day3.getYear() + " " + day3.getMonth());}
}interface Prototype {public Object Clone();
}class Day implements Prototype {private int year;private double month;public Day() {}public Day(int year, double month) {this.year = year;this.month = month;}public int getYear() {return year;}public double getMonth() {return month;}@Overridepublic Object Clone() {//克隆对象Day object = new Day();object.year = this.year;object.month = this.month;return object;}
}

运行结果

日期1:2001 1.21
日期2:2001 1.21
日期3:2001 1.21

5、单例模式(对象模式)

意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。(唯一实例)

适用性

  1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  2. 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。

代码实现

//5 单例模式
public class SingletonPattern {public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();Singleton singleton3 = Singleton.getInstance();System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());singleton1.setNumber(121);System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());}
}class Singleton {private int number = 2001;public void setNumber(int number) {this.number = number;}public int getNumber() {return number;}//创建仅有的一个对象private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

运行结果

2001 2001 2001
121 121 121

软件设计师——设计模式笔记上相关推荐

  1. 软件设计师——设计模式笔记下

    软件设计师--设计模式笔记下(行为型11种) 13.责任链模式(对象模式) 意图 适用性 代码实现 14.命令模式(对象模式) 意图 适用性 代码实现 15.解释器模式(类模式) 意图 适用性 代码实 ...

  2. 【软考中级】软件设计师学习笔记

    软件设计师学习笔记 计算机系统知识 程序语言设计 数据结构 操作系统 软件工程基础知识 结构化开发方法 创建型设计模式 行为型设计模式 结构型设计模式: 算法设计与分析 数据库技术基础 网络与信息安全 ...

  3. 软件设计师考试笔记-(6)

    1.软件设计师考试笔记-(6) 1.6 Pert图:工程网络图 1.6.1 概述 工程网络图主要用于工程项目计划管理,它首先将施工项目整个建造过程分解成若干项工作,以规定的网络符号表达各项工作之间的相 ...

  4. 软件设计师考试笔记-(7)

    2.软件设计师考试笔记-(7) 2.1.面向对象基本概念 面向对象(Object Oriented)是软件开发方法,一种编程范式.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交 ...

  5. 软件设计师考试笔记-(10)

    软件设计师考试笔记-(10) 1.操作系统基本原理 1.1.进程管理 1.1.1.进程状态 1.1.2.前趋图 为了描述一个程序的各部分间的依赖关系,或者是一个大的计算的各个子任务间的因果关系的图示. ...

  6. 软件设计师习题笔记-重点习题六

    1.机器字长为n位的二进制数可以用补码来表示( )个不同的有符号定点小数. 解析: 2.Cache的地址映像方式中,发生块冲突次数最小的是(全相联映像 ). 解析: 本题考查计算机组成的基础知识. C ...

  7. 软件设计师备考笔记(一)软考概述

    目录 考试的历史 培训课程安排计划 推荐参考书籍 策略:先建体系,后整理知识点 幸福曲线 考试大纲 考试形式 学习方法: 历史 从日本引进的考试:以前叫高级程序员考试,IT领域细化后分为了软件设计师: ...

  8. 软件设计师学习笔记-知识产权

    前言 备战2023年5月份的软件设计师考试,在此记录学习之路. 知识点总结,具体内容请查看对应的模块. 提示:这里有软件设计师资料,包含软件设计师考试大纲.软件设计师第五版官方教程.历年考试真题. 通 ...

  9. 软件设计师习题笔记-重点习题四

    1.在程序运行过程中,CPU需要将指令从内存中取出并加以分析和执行.CPU依据(指令周期的不同阶段)来区分在内存中以二进制编码形式存放的指令和数据. 解析: 本题查计算机系统基础知识. 指令周期是执行 ...

最新文章

  1. python若干整数的最大值_实例讲解Python中整数的最大值输出
  2. Linux 终端操作之简明疾速指南(1)
  3. 筒灯智能驱动芯片作用_魅族携8款智能照明新品进军智能家居,剑指行业前三...
  4. Tree的前序序列化
  5. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录
  6. 双路服务器cpu必须型号相同,双路主板存在使用不同型号的cpu之说吗?还是必须使用一模一样相同的cpu型号?...
  7. python语言三大基本控制结构_Python基础(4) 控制结构
  8. 【转】系统管理员之企业生存守则
  9. 骑马与砍杀服务器修复,骑马与砍杀21.3.1公共版和热修说明 修复联机模式
  10. 输入年月日获取农历日期
  11. Error running' xxxxxx': Command line is too long. Shorten command line for xxxxxxxxx
  12. 靶机渗透练习57-digitalworld.local:JOY
  13. android 辅助功能(无障碍)
  14. Spring AOP的术语:
  15. MFC学习之 对话框设置背景颜色及控件透明的方法
  16. POI动态导出多层表头的EXCEL文件
  17. python中ipaddr库用法详解
  18. 中国口腔医疗行业发展模式与投资战略规划分析报告2022-2028年版
  19. Linux启动引导参数grub
  20. IBM Storwize V5000资源管理柜

热门文章

  1. Kerberos 使用小记
  2. 关于“增减挂钩“政策的整理
  3. Java时间工具类,获取日、周、旬、月、季度、半年、年等时间周期
  4. web作业(怎么在短时间做出三个精美的网页)
  5. 数字藏品的作者合作协议怎么写
  6. 杭电 1272 小希的迷宫
  7. Makefile中的filter函数
  8. java 使用fusioncharts_FusionCharts使用教程:自定义图表——画布
  9. C语言程序:评委打分类题型
  10. Kotlin 之 协程