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粉刷匠

粉刷匠(bzoj 1296)

[SCOI2009]粉刷匠(分组背包)

[SCOI2009]粉刷匠(分组背包)

bzoj 1296: [SCOI2009]粉刷匠

JZOJ 1035. SCOI2009粉刷匠