Java设计模式笔记
- 七大设计原则核心思想
- 能够以类图的说明设计原则
- 在项目实际开发中,你在哪里使用到了ocp原则
- 单例设计模式一共有几种实现方式?
设计模式常用七大原则有:
- 单一职责原则
- 接口隔离原则
- 依赖倒转原则
- 里氏替换原则
- 开闭原则ocp
- 迪米特法则
- 合成复用原则
单一职责原则
及一个类应该只负责一项职责
单例设计模式一共有8种写法
- 饿汉式 两种
- 懒汉式 三种
- 双重检查
- 静态内部类
- 枚举
依赖关系传递的三种方式
-
接口传递
-
构造方法传递
-
setter传递
里氏替换原则
- 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
- 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖 来解决问题。
开闭原则
- 开闭原则(Open Closed Principle)是最基础、最重要的设计原则
- 一个软件实体如类,模块和函数应该对扩展开放(提供方),对修改关闭(使用方)。用抽象构建框架,用实现扩展细节。
- 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则
迪米特法则
- 一个对象应该对其他对象保持最少的了解
- 类与类关系越密切,耦合度越大
- 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己的依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息
- 迪米特法则还有个更简单的定义:只与直接的朋友通信
- 直接的朋友:每个对象都会与其他对象由耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系,耦合的方式很多,依赖,关联,组合,聚合 等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现的局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。
合成复用原则
- 原则是尽量使用合成/聚合的方式,而不是使用继承
- 如果只是为了用到另一个类的方法则没有必要继承
设计原则核心思想
- 找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起。
- 针对接口变成,而不是针对实现编程。
- 为了交互独享之间的松耦合设计而努力。
UML基本类图
- 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。
- 类之间的关系:依赖、泛化(继承)、实现、关联、聚合与组合
依赖 :只要我这个类用到另一个类,就是依赖关系
泛化: 就是继承了另一个类 (依赖关系的特例)
实现: 实现关系实际上就是A类实现B类,他也是依赖关系的特例
关联:关联关系实际上就是类与类之间的联系,他是依赖关系的特例,关联具有导航性:即双向关系或单向关系,关系具有多重性:如"1"(表示有且仅有一个),"0.."(表示0个或者多个),“0, 1”(表示0个或者一个),“n..m”(表示n个到 m个都可以),"m .."(表示至少m个)
聚合: 表示的是整体和部分的关系,整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性
组合: 整体与部分不可分离
设计模式类型
设计模式分为三种类型,共23种
- 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
- 结构性模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
- 行为型模式:模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interperter)、状态模式、策略模式、职责链模式(责任链模式)。
不同的书籍对分类和名称略有差别
单例模式实现
懒汉式
public class Signleton {
private static Signleton instance = null; //静态私有成员变量
private Signleton(){ //私有构造函数
}
//静态公有工厂方法,返回唯一的实例
public static Signleton getInstance(){
if (instance == null){
instance = new Signleton();
}
return instance;
}
}
懒汉式(双重检查)
public class Signleton {
private volatile static Signleton instance = null;
private Signleton(){}
public static Signleton getInstance(){
if (instance == null){
synchronized (Signleton.class){ //synchronized 同步锁
if (instance == null){
instance = new Signleton();
}
}
}
return instance;
}
}
饿汉式
public class Signleton {
private static final Signleton instance = new Signleton(); //静态私有成员变量
private Signleton(){}
public static Signleton getInstance(){
return instance;
}
}
简单工厂
abstract class Product{
//所有产品类的公共业务方法
public void methodSame(){
System.out.println("公共方法");
//公共方法的实现
}
//声明抽象业务方法
public abstract void mmethodDiff();
}
class ConcreateProductA extends Product{
@Override
public void mmethodDiff() {
System.out.println("产品A");
}
}
class ConcreateProductB extends Product{
@Override
public void mmethodDiff() {
System.out.println("产品B");
}
}
//通过if判断 用户传进来的产品,然后创建不同的对象
class Factory{
//静态工厂方法
public static Product getProduct(String arg){
Product product = null;
if (arg.equalsIgnoreCase("A")){
product = new ConcreateProductA();
} else if (arg.equalsIgnoreCase("B")){
product = new ConcreateProductB();
}
return product;
}
}
简单工厂(咖啡店点餐)
//定义抽象产品 咖啡
abstract class Coffee{
//定义公共方法
public void addMilk(){
System.out.println("加奶");
}
public void addsugar(){
System.out.println("加糖");
}
public abstract void getName();
}
//具体产品
class AmericanCoffee extends Coffee{
@Override
public void getName() {
System.out.println("美式咖啡");
}
}
class LatteCoffee extends Coffee{
@Override
public void getName() {
System.out.println("拿铁咖啡");
}
}
//静态工厂
class CoffeeFactory{
//静态工厂方法
public static Coffee createCoffee(String type){
Coffee coffee = null;
if (type.equalsIgnoreCase("american")){
coffee = new AmericanCoffee();
}else if (type.equalsIgnoreCase("latee")){
coffee = new LatteCoffee();
}
return coffee;
}
}
工厂模式
package com.hspedu.Test12.Factory1;
//一个工厂创建一个产品
public class Client {
public static void main(String[] args) {
new HaierTVFactory().produceTV().play();
new HisenseTVFactory().produceTV().play();
}
}
//定义产品接口
interface TV{
public void play();
}
//定义产品工厂
interface TVFactory{
public TV produceTV();
}
class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔电视!");
}
}
class HisenseTV implements TV{
@Override
public void play() {
System.out.println("海信电视!");
}
}
class HaierTVFactory implements TVFactory{
@Override
public TV produceTV() {
return new HaierTV();
}
}
class HisenseTVFactory implements TVFactory{
@Override
public TV produceTV() {
return new HisenseTV();
}
}
2、背景:小成有一间塑料加工厂(仅生产A类产品);随着客户需求的变化,客户需要生产B类产品
package com.hspedu.Test12.Factory2;
//目前只有一个产品
public class Client {
public static void main(String[] args) {
new FactoryA().Factory().creat();
}
}
//抽象产品
interface produce{
void creat();
}
//具体产品A
class produceA implements produce{
@Override
public void creat() {
System.out.println("生产A!");
}
}
//抽象工厂
interface Factory{
public produce Factory();
}
//具体工厂
class FactoryA implements Factory{
@Override
public produce Factory() {
return new produceA();
}
}
冲突:改变原有塑料加工厂的配置和变化非常困难,假设下一次客户需要再发生变化,再次改变将增大非常大的成本;
解决方案:小成决定置办塑料分厂B来生产B类产品;
package com.hspedu.Test12.Factory2;
public class Client {
public static void main(String[] args) {
new FactoryA().Factory().creat();
new FactoryB().Factory().creat();
}
}
//抽象产品
interface produce{
void creat();
}
//具体产品A
class produceA implements produce{
@Override
public void creat() {
System.out.println("生产A!");
}
}
class produceB implements produce{
@Override
public void creat() {
System.out.println("生产B!");
}
}
//抽象工厂
interface Factory{
public produce Factory();
}
//具体工厂
class FactoryA implements Factory{
@Override
public produce Factory() {
return new produceA();
}
}
class FactoryB implements Factory{
@Override
public produce Factory() {
return new produceB();
}
}
抽象工厂练习
package com.hspedu.Test12.Factory3;
public class Client {
public static void main(String[] args) {
new ConcreteFactory1().product1().show();
new ConcreteFactory1().product2().show();
new ConcreteFactory2().product1().show();
new ConcreteFactory2().product2().show();
}
}
//抽象产品1
interface Product1{
void show();
}
//抽象产品2
interface Product2{
void show();
}
//具体产品
class ConcreteProduct11 implements Product1{
@Override
public void show() {
System.out.println("产品11");
}
}
class ConcreteProduct12 implements Product1{
@Override
public void show() {
System.out.println("产品12");
}
}
class ConcreteProduct21 implements Product2{
@Override
public void show() {
System.out.println("产品21");
}
}
class ConcreteProdu22 implements Product2{
@Override
public void show() {
System.out.println("产品22");
}
}
//抽象工厂
interface AbstractFactory {
public Product1 product1();
public Product2 product2();
}
//具体工厂
class ConcreteFactory1 implements AbstractFactory{
@Override
public Product1 product1() {
return new ConcreteProduct11();
}
@Override
public Product2 product2() {
return new ConcreteProduct21();
}
}
class ConcreteFactory2 implements AbstractFactory{
@Override
public Product1 product1() {
return new ConcreteProduct12();
}
@Override
public Product2 product2() {
return new ConcreteProdu22();
}
}
建造者模式
- 抽象建造者
- 具体建造者
- 产品
- 指挥者
package com.hspedu.Test12.BuilderPattern;
public class Client {
public static void main(String[] args) {
KFCWaiter kfcWaiter = new KFCWaiter();
kfcWaiter.setMb(new SubMealBuilderA());
Meal meal;
meal = kfcWaiter.construct();
System.out.println(meal);
}
}
class Meal{
private String food;
private String drink;
public Meal() {
}
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
@Override
public String toString() {
return "Meal{" +
"food='" + food + '\'' +
", drink='" + drink + '\'' +
'}';
}
}
//抽象建造者
abstract class MealBuilder{
protected Meal meal = new Meal();
public abstract void buildFood();
public abstract void builDrink();
public Meal getMeal(){
return meal;
}
}
//具体建造者
class SubMealBuilderA extends MealBuilder{
@Override
public void buildFood() {
//System.out.println("鸡腿堡");
meal.setFood("鸡腿堡");
}
@Override
public void builDrink() {
//System.out.println("可乐");
meal.setFood("可乐");
}
}
class SubMealBuilderB extends MealBuilder{
@Override
public void buildFood() {
//System.out.println("鸡肉卷");
meal.setFood("鸡肉卷");
}
@Override
public void builDrink() {
//System.out.println("橙汁");
meal.setFood("橙汁");
}
}
//指挥者
class KFCWaiter{
private MealBuilder mb;
public void setMb(MealBuilder mb) {
this.mb = mb;
}
public Meal construct(){
mb.buildFood();
mb.builDrink();
Meal meal = mb.getMeal();
return meal;
}
}
评论区