23种设计模式
Posted java全栈_coder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式相关的知识,希望对你有一定的参考价值。
此笔记从B站狂神说Java 获取
什么是设计模式
学习设计模式的意义
GoF23
oop七大原则
(1)开闭原则: 一个软件的实体应当对扩展开放,对修改关闭;
(2)里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
(3)依赖倒置原则:要面向接口编程,不要面向实现编程。
(4)单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性。
(5)接口隔离原则:要为各个类建立它们需要的专用接口
(6)迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话。
(7)合成复用原则:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
工厂模式
1、作用:实现创建者和调用者分离
2、00P七大原则:
(1)开闭原则: 一个软件的实体应当对扩展开放,对修改关闭;
(2)依赖倒转原则:要针对接口编程,不要针对实现编程;
(3)迪米特法则:只与你直接的朋友通信,而避免和陌生人通信;
3、核心本质:
(1)实例化对象不使用new, 用工厂方法代替
(2)将选择实现类, 创建对象统一管理和控制。 从而将调用者跟我们的实现类解耦。
简单工厂模式
1.Car接口
package com.etc.factory.simple;
public interface Car
void name();
2.车 WuLing
package com.etc.factory.simple;
public class WuLing implements Car
@Override
public void name()
System.out.println("五菱");
3.车 Tesla
package com.etc.factory.simple;
public class Tesla implements Car
@Override
public void name()
System.out.println("特斯拉");
4.CarFactory (创建工厂)
package com.etc.factory.simple;
//简单工厂模式 静态工厂模式
//开闭原则
public class CarFactory
//方法一
public static Car getCar(String car)
//如果添加其他类,需要修改下列代码,修改逻辑
if (car.equals("五菱"))
return new WuLing();
else if (car.equals("特斯拉"))
return new Tesla();
else
return null;
//出现问题 增加一个车呢?
//方法二 不修改原逻辑的情况下
public static Car getwuling()
return new WuLing();
public static Car getTesla()
return new Tesla();
5.Consumer
package com.etc.factory.simple;
public class Consumer
public static void main(String[] args)
// 1 常规创建
// Car car1=new WuLing();
// Car car2=new Tesla();
// 2 使用工厂创建
Car car1 = CarFactory.getCar("五菱");
Car car2 = CarFactory.getCar("特斯拉");
car1.name();
car2.name();
工厂方法模式
1.car接口
package com.etc.factory.method;
public interface Car
void name();
2.CarFactory接口
package com.etc.factory.method;
//工厂方法模式
public interface CarFactory
Car getCar();
3.车 WuLing
package com.etc.factory.simple;
public class WuLing implements Car
@Override
public void name()
System.out.println("五菱");
4.给五菱单独创建个工厂 WuLingFactory
package com.etc.factory.method;
public class WuLingFactory implements CarFactory
@Override
public Car getCar()
return new WuLing();
5.车 Tesla
package com.etc.factory.simple;
public class Tesla implements Car
@Override
public void name()
System.out.println("特斯拉");
6.给Tesla单独创建个工厂 TeslaFactory
package com.etc.factory.method;
public class TeslaFactory implements CarFactory
@Override
public Car getCar()
return new Tesla();
7.Consumer
package com.etc.factory.method;
public class Consumer
public static void main(String[] args)
Car car1 = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
car1.name();
car2.name();
结构复杂度: simple
代码复杂度: simple
编程复杂度: simple
管理上的复杂度: simple
根据设计原则:工厂方法模式!
根据实际业务:简单工厂模式!
图片解释
抽象工厂模式
代码演示
1.IPhoneProduct接口
//手机产品接口
public interface IPhoneProduct
void start();
void shutdown();
void callup();
void sendMS();
2.IRouteProduct接口
//路由器产品接口
public interface IRouteProduct
void start();
void shutdown();
void openWife();
void setting();
3.小米手机
package com.etc.factory.abstract1;
public class XiaomiPhone implements IPhoneProduct
@Override
public void start()
System.out.println("开启小米手机");
@Override
public void shutdown()
System.out.println("关闭小米手机");
@Override
public void callup()
System.out.println("小米打电话");
@Override
public void sendMS()
System.out.println("小米发短信");
4.小米路由器
package com.etc.factory.abstract1;
public class XiaomiRouter implements IRouteProduct
@Override
public void start()
System.out.println("启动小米路由器");
@Override
public void shutdown()
System.out.println("关闭小米路由器");
@Override
public void openWife()
System.out.println("开启小米wifi");
@Override
public void setting()
System.out.println("设置小米路由器");
5.华为手机
package com.etc.factory.abstract1;
public class HuaweiPhone implements IPhoneProduct
@Override
public void start()
System.out.println("开启华为手机");
@Override
public void shutdown()
System.out.println("关闭华为手机");
@Override
public void callup()
System.out.println("华为打电话");
@Override
public void sendMS()
System.out.println("华为发短信");
6.华为路由器
package com.etc.factory.abstract1;
public class HuaweiRouter implements IRouteProduct
@Override
public void start()
System.out.println("启动华为路由器");
@Override
public void shutdown()
System.out.println("关闭华为路由器");
@Override
public void openWife()
System.out.println("开启华为wifi");
@Override
public void setting()
System.out.println("设置华为路由器");
7.抽象工厂
package com.etc.factory.abstract1;
//抽象产品工厂
public interface IProductFactory
//生产手机
IPhoneProduct iphoneProduct();
//生产路由器
IRouteProduct routeProduct();
8.小米工厂
package com.etc.factory.abstract1;
public class XiaomiFactory implements IProductFactory
@Override
public IPhoneProduct iphoneProduct()
return new XiaomiPhone();
@Override
public IRouteProduct routeProduct()
return new XiaomiRouter();
9.华为工厂
package com.etc.factory.abstract1;
public class HuaweiFactory implements IProductFactory
@Override
public IPhoneProduct iphoneProduct()
return new HuaweiPhone();
@Override
public IRouteProduct routeProduct()
return new HuaweiRouter();
10.客户端使用
package com.etc.factory.abstract1;
public class Client
public static void main(String[] args)
System.out.println("=======小米系列产品=========");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IPhoneProduct iPhoneProduct = xiaomiFactory.iphoneProduct();
iPhoneProduct.callup();
iPhoneProduct.sendMS();
IRouteProduct iRouteProduct = xiaomiFactory.routeProduct();
iRouteProduct.openWife();
System.out.println("=======华为系列产品=========");
HuaweiFactory huaweiFactory = new HuaweiFactory();
iPhoneProduct = huaweiFactory.iphoneProduct();
iPhoneProduct.callup();
iPhoneProduct.sendMS();
iRouteProduct = huaweiFactory.routeProduct();
iRouteProduct.openWife();
建造者模式
代码演示
1.抽象的建造者
package com.etc.factory.builder;
//抽象的建造者 : 方法
public abstract class Builder
abstract void buildA();//地基
abstract void buildB();//钢筋工程
abstract void buildC();//铺电线
abstract void buildD();//粉刷
//完工 :得到产品
abstract Product getProduct();
2.产品: 房子
package com.etc.factory.builder;
//产品: 房子
public class Product
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public String getBuildA()
return buildA;
public void setBuildA(String buildA)
this.buildA = buildA;
public String getBuildB()
return buildB;
public void setBuildB(String buildB)
this.buildB = buildB;
public String getBuildC()
return buildC;
public void setBuildC(String buildC)
this.buildC = buildC;
public String getBuildD()
return buildD;
public void setBuildD(String buildD)
this.buildD = buildD;
@Override
public String toString()
return "Product" +
"buildA='" + buildA + '\\'' +
", buildB='" + buildB + '\\'' +
", buildC='" + buildC + '\\'' +
", buildD='" + buildD + '\\'' +
'';
3.具体的建造者
package com.etc.factory.builder;
//具体的建造者 : 工人
public class Worker extends Builder
private Product product;
public Worker()
product=new Product();
@Override
void buildA()
product.setBuildA("地基");
System.out.println("地基");
@Override
void buildB()
product.setBuildB("钢筋工程");
System.out.println("钢筋工程");
@Override
void buildC()
product.setBuildB("铺电线");
System.out.println("铺电线");
@Override
void buildD()
product.setBuildB("粉刷");
System.out清北前紧急补课12粉刷匠