此笔记从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) {
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.println("粉刷");
}
@Override
Product getProduct() {
return product;
}
}
4.指挥者
package com.etc.factory.builder;
public class Director {
public Product build(Builder builder){
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
}
5.测试
package com.etc.factory.builder;
public class Test {
public static void main(String[] args) {
Director director = new Director();
Product build = director.build(new Worker());
System.out.println(build.toString());
}
}
代码再理解
1.建造者
package com.etc.factory.builder2;
public abstract class Builder {
abstract Builder buildA(String msg);
abstract Builder buildB(String msg);
abstract Builder buildC(String msg);
abstract Builder buildD(String msg);
abstract Product getProduct();
}
2.产品
package com.etc.factory.builder2;
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) {
BuildA = buildA;
}
public String getBuildB() {
return BuildB;
}
public void setBuildB(String buildB) {
BuildB = buildB;
}
public String getBuildC() {
return BuildC;
}
public void setBuildC(String buildC) {
BuildC = buildC;
}
public String getBuildD() {
return BuildD;
}
public void setBuildD(String buildD) {
BuildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"BuildA='" + BuildA + '\'' +
", BuildB='" + BuildB + '\'' +
", BuildC='" + BuildC + '\'' +
", BuildD='" + BuildD + '\'' +
'}';
}
}
3.具体的建造者
package com.etc.factory.builder2;
public class Worker extends Builder{
private Product product;
public Worker(){
product=new Product();
}
@Override
Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
Product getProduct() {
return product;
}
}
4.测试
package com.etc.factory.builder2;
public class Test {
public static void main(String[] args) {
Worker worker = new Worker();
Product product = worker.buildA("全家桶")
.buildB("雪碧").getProduct();
System.out.println(product.toString());
}
}
原型模式
代码演示 demo01
1.Video
package com.etc.prototype.demo01;
import java.util.Date;
public class Video implements Cloneable{
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Video() {
}
public Video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
2.Bilibili
package com.etc.prototype.demo01;
import java.util.Date;
public class Bilibili {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Video v1 = new Video("狂神说java", date);
Video v2 = (Video) v1.clone();
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
System.out.println("=======");
date.setTime(21312231);
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
}
}
代码演示 demo02 深克隆
1.Video
package com.etc.prototype.demo02;
import java.util.Date;
public class Video implements Cloneable{
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
Video v = (Video) obj;
v.createTime = (Date) this.createTime.clone();
return obj;
}
public Video() {
}
public Video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
2.Bilibili
package com.etc.prototype.demo02;
import java.util.Date;
public class Bilibili {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Video v1 = new Video("狂神说java", date);
Video v2 = (Video) v1.clone();
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
System.out.println("=======");
date.setTime(21312231);
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
}
}
适配器模式
代码演示
1.Adaptee
package com.etc.adapter;
public class Adaptee {
public void request(){
System.out.println("连接网线上网");
}
}
2.NetToUsb
package com.etc.adapter;
public interface NetToUsb {
public void handleRequest();
}
3.Adapter
package com.etc.adapter;
public class Adapter extends Adaptee implements NetToUsb{
@Override
public void handleRequest() {
super.request();
}
}
4.Computer
package com.etc.adapter;
public class Computer {
public void net(NetToUsb netToUsb){
netToUsb.handleRequest();
}
public static void main(String[] args) {
Computer computer = new Computer();
Adaptee adaptee = new Adaptee();
Adapter adapter = new Adapter();
Adapter2 adapter2=new Adapter2(adaptee);
computer.net(adapter2);
}
}
升级版 Adapter2
package com.etc.adapter;
public class Adapter2 implements NetToUsb{
private Adaptee adaptee;
public Adapter2(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void handleRequest() {
adaptee.request();
}
}
桥接模式
代码演示
1.Brand
package com.etc.bridge;
public interface Brand {
void info();
}
2.Lenovo联想品牌
package com.etc.bridge;
public class Lenovo implements Brand{
@Override
public void info() {
System.out.print("联想");
}
}
3.苹果品牌
package com.etc.bridge;
public class Apple implements Brand{
@Override
public void info() {
System.out.print("苹果");
}
}
4.组合
package com.etc.bridge;
public abstract class Computer {
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void info(){
brand.info();
}
}
class Desktop extends Computer{
public Desktop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("台式机");
}
}
class Laptop extends Computer{
public Laptop(Brand brand) {
super(brand);
}
@Override
public void info() {
super.info();
System.out.print("笔记本");
}
}
5.测试
package com.etc.bridge;
public class Test {
public static void main(String[] args) {
Computer computer = new Laptop(new Apple());
computer.info();
System.out.println();
Computer computer2 = new Desktop(new Lenovo());
computer2.info();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)