Java 六种常见的设计模式:单例,工厂,策略,模板方法,适配器,代理

目录

1. 单例模式 SingletonPattern

1.1 什么是单例模式

1.2 简单示例代码

2. 工厂模式 FactoryMethod

2.1 什么是工厂模式

2.2 简单示例代码

3. 策略模式 StrategyMethod

3.1 什么是策略模式

3.2 示例代码

4. 模板方法模式 TemplateMethod

4.1 什么是模板方法模式

4.2 示例代码

5. 适配器模式 AdapterMethod

5.1 什么是适配器模式

5.2 示例代码

6. 代理模式 ProxyMethod

6.1 什么是代理模式

6.2 示例代码


【写在前面】

此文是学习笔记。今天复习了Java的设计模式,所以另起该文,动手做练习。如侵请告知,会删。

背景知识

设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。

使用设计模式,是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。

设计模式使代码编制真正工程化,是软件工程的基石。

1. 单例模式 SingletonPattern

1.1 什么是单例模式

属于创建型模式。

单例模式确保某一个类只要一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式只因在有真正的单一实例的需求时才可使用。

1.2 简单示例代码

package com.designmode.demo;

public class SingletonMode {
    private static final SingletonMode singletonMode = new SingletonMode();

    //构造函数,private, 限制了不能通过new直接产生一个实例
    private SingletonMode(){
    }

    public synchronized static SingletonMode getInstance(){
        return singletonMode;
    }

    public void test(){
        System.out.println("我是单例模式:" + getInstance());
    }

}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {
        //单例模式,直接通过类名调用方法生成实例,再通过实例调用其他方法
        SingletonMode.getInstance().test();
    }
}

运行结果: 

我是单例模式:com.designmode.demo.SingletonMode@2503dbd3

Process finished with exit code 0

2. 工厂模式 FactoryMethod

2.1 什么是工厂模式

属于创建型模式。

工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

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

2.2 简单示例代码

package com.designmode.demo;

public interface SportsInterface {
    public void like();
    public void notLike();
}
package com.designmode.demo;

public class BasketBall implements SportsInterface{
    @Override
    public void like() {
        System.out.println("我喜欢打篮球!");
    }

    @Override
    public void notLike() {
        System.out.println("我不喜欢打篮球!");
    }
}
package com.designmode.demo;

public class Running implements SportsInterface{
    @Override
    public void like() {
        System.out.println("我喜欢跑步!");
    }

    @Override
    public void notLike() {
        System.out.println("我不喜欢跑步!");
    }
}
package com.designmode.demo;

public class FactoryMode {
    public static SportsInterface checkSports(Class clazz) {
        SportsInterface sport = null;

        try {
            sport = (SportsInterface) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sport;
    }
}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {

        //工厂模式
        SportsInterface basketBall = FactoryMode.checkSports(BasketBall.class);
        SportsInterface running = FactoryMode.checkSports(Running.class);
        basketBall.like();
        basketBall.notLike();
        running.like();
        running.notLike();
    }
}

 运行结果

我喜欢打篮球!
我不喜欢打篮球!
我喜欢跑步!
我不喜欢跑步!

Process finished with exit code 0

 

3. 策略模式 StrategyMethod

3.1 什么是策略模式

是行为型模式。

策略模式定义额一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口。

然后设计一个抽象类(可有可无,属于辅助类),提供辅助函数。

最后设计实现类。

3.2 示例代码

package com.designmode.demo;

public interface StrategyInterface {
    public void operate();
}
package com.designmode.demo;

public class StrategyDemo1 implements StrategyInterface{
    @Override
    public void operate() {
        System.out.println("我是策略1");
    }
}
package com.designmode.demo;

public class StrategyDemo1 implements StrategyInterface{
    @Override
    public void operate() {
        System.out.println("我是策略1");
    }
}
package com.designmode.demo;

public class Context {
    private StrategyInterface strategy;

    public Context(StrategyInterface strategy){
        this.strategy = strategy;
    }

    public void setStrategy(StrategyInterface strategy){
        this.strategy = strategy;
    }

    public void operate(){
        this.strategy.operate();
    }
}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {
        //策略模式
        Context context;
        context = new Context(new StrategyDemo1());
        context.operate();

        context = new Context(new StrategyDemo2());
        context.operate();
    }
}

运行结果

我是策略1
我是策略2

Process finished with exit code 0

4. 模板方法模式 TemplateMethod

4.1 什么是模板方法模式

是行为型模式。

模板方法,是类的行为模式。准备一个抽象类,将部分逻辑以具体的方法以及具体的构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。

不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

目的是定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

4.2 示例代码

package com.designmode.demo;

public abstract class BMWModel {
    public abstract void start();

    public abstract void alarm();

    public abstract void stop();

    public void run(){
        this.start();
        this.alarm();
        this.stop();
    }
}
package com.designmode.demo;

public class BMWModel1 extends BMWModel{
    @Override
    public void start() {
        System.out.println("宝马1启动~");
    }

    @Override
    public void alarm() {
        System.out.println("宝马1鸣笛~");
    }

    @Override
    public void stop() {
        System.out.println("宝马1停止~");
    }
}
package com.designmode.demo;

public class BMWModel2 extends BMWModel{
    @Override
    public void start() {
        System.out.println("宝马2启动~");
    }

    @Override
    public void alarm() {
        System.out.println("宝马2鸣笛~");
    }

    @Override
    public void stop() {
        System.out.println("宝马2停止~");
    }
}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {

        //模板方法模式
        BMWModel bmw1 = new BMWModel1();
        bmw1.run();

        BMWModel bmw2 = new BMWModel2();
        bmw2.run();
    }
}

运行结果:

宝马1启动~
宝马1鸣笛~
宝马1停止~
宝马2启动~
宝马2鸣笛~
宝马2停止~

Process finished with exit code 0

5. 适配器模式 AdapterMethod

5.1 什么是适配器模式

是结构型模式。

适配器模式的核心是,当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法是就用默认的适配器模式。

该方法在接口和具体实现类之间添加了一个抽象类,用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

目的是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

5.2 示例代码

package com.designmode.demo;

public interface LanguageInterface {
    public abstract void speakChinese();
    public abstract void speakEnglish();
    public abstract void speakGerman();
}
package com.designmode.demo;

public class Language implements LanguageInterface{
    @Override
    public void speakChinese() {
    }

    @Override
    public void speakEnglish() {
    }

    @Override
    public void speakGerman() {
    }
}
package com.designmode.demo;

public class ChineseSpeaking extends Language{
    public void speakChinese(){
        System.out.println("我是中国人,我会说中文!");
    }
}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {

        //适配器模式
        LanguageInterface chinese = new ChineseSpeaking();
        chinese.speakChinese();
    }
}

运行结果:

我是中国人,我会说中文!

Process finished with exit code 0

6. 代理模式 ProxyMethod

6.1 什么是代理模式

是结构型模式。

代理模式中,一个类代表另一个类的功能。创建具有现有对象的对象,以便向外界提供功能接口。

目的是为其他对象提供一种代理以控制对这个对象的访问。

6.2 示例代码

//定义接口
public interface BuyHouse {
    void buyHouse();
}
 //定义被代理类,实现接口
public class HouseBuyer implements BuyHouse{
    @Override
    public void buyHouse() {
        System.out.println("我是买房者,我要买房");
    }
}
 
//定义代理类,也实现接口
public class HouseProxy implements BuyHouse{
    private BuyHouse buyHouse;
 
    public HouseProxy(BuyHouse buyHouse){
        this.buyHouse = buyHouse;
    }
 
    @Override
    public void buyHouse() { //重写接口中的方法,在接口方法原来的内容基础加上一些代理动作
        System.out.println("买房前准备");
        buyHouse.buyHouse();
        System.out.println("买房后售后");
    }
}
package com.designmode.demo;

public class MyDemo {
    public static void main(String[] args) {

        //代理模式
        BuyHouse buyHouse = new HouseBuyer(); //声明接口,但new被代理类的实例,下面要传入代理中
        HouseProxy houseProxy = new HouseProxy(buyHouse);
        houseProxy.buyHouse();
    }
}

运行结果:

买房前准备
我是买房者,我要买房
买房后售后

Process finished with exit code 0

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Java设计模式是一套经过总结和整理的编程思想,用于解决软件开发中常见的问题。《Java设计模式:23种设计模式全面解析(超级详细)》是一本详细介绍这23种设计模式的书籍,它可以帮助读者深入理解每种设计模式的原理和用法。 这本书分为23个章节,每个章节介绍一种设计模式。每个章节都从问题的背景出发,描述该设计模式的目标和应用场景。然后,通过实代码和图形示意来展示如何使用该设计模式解决问题。 书中详细介绍了创建型设计模式、结构型设计模式和行为型设计模式。在创建型设计模式方面,包括模式工厂模式、抽象工厂模式、建造者模式和原型模式等。结构型设计模式包括适配器模式、装饰器模式代理模式、组合模式和桥接模式等。行为型设计模式包括策略模式、观察者模式、迭代器模式、命令模式模板方法模式等。 每个设计模式都有其特定的使用场景和适用性,读者可以根据自己的需求选择合适的设计模式来解决问题。通过学习这本书,读者可以深入理解设计模式的原理和思想,并且能够应用到实际的软件开发中。 总的来说,《Java设计模式:23种设计模式全面解析(超级详细)》是一本对于Java开发者来说非常有价值的书籍。它通过详细的示和解释,帮助读者深入理解23种设计模式的使用方法,使读者能够灵活地应用设计模式解决实际开发中遇到的问题。无论是初学者还是有一定经验的开发者,都可以从这本书中受益匪浅。 ### 回答2: 《Java设计模式:23种设计模式全面解析(超级详细)》是一本介绍Java设计模式的全面解析书籍。设计模式是软件工程领域中的一种解决问题的思维方式和经验总结,能够提供可复用的解决方案。这本书详细介绍了23种经典的设计模式,包括创建型、结构型和行为型三种类型的模式。 在创建型设计模式方面,书中包含了模式、原型模式工厂方法模式、抽象工厂模式、建造者模式。这些模式都是用来创建对象的,通过不同的实现方式能够灵活地创建对象,并且符合原则,如一职责原则、开闭原则等。 在结构型设计模式方面,书中介绍了适配器模式、装饰器模式代理模式、外观模式等。这些模式通过组合不同的类和对象,来解决不同类间关系的问题,增加了程序的可扩展性和灵活性。 在行为型设计模式方面,书中讲解了观察者模式模板方法模式策略模式、命令模式等。这些模式着重于对象之间的通信和协作,通过定义不同的行为和规则,让对象能够更好地进行交互,降低了对象间的耦合度。 此外,书中还介绍了其他几种分类的设计模式,如迭代器模式、访问者模式、备忘录模式等,这些模式在特定的应用场景中发挥着重要作用。 总的来说,《Java设计模式:23种设计模式全面解析(超级详细)》是一本详细介绍了Java设计模式的书籍,对于想深入了解和应用设计模式Java开发人员来说,是一本很好的资料,能够帮助他们理解,并在实际项目中应用这些经典的设计模式。 ### 回答3: Java设计模式是一套被广泛应用于软件设计的规范和经验总结。设计模式可以提供可重用和可维护的代码,能够帮助开发人员解决常见的软件设计问题。 Java设计模式一共有23种,分为创建型模式、结构型模式和行为型模式三个类别。 创建型模式包括模式工厂模式、抽象工厂模式、建造者模式和原型模式模式确保一个类只有一个实工厂模式将对象的创建委托给工厂类,抽象工厂模式允许客户端使用抽象接口来创建一组相关对象,建造者模式通过一步步构建复杂对象,原型模式通过克隆已有对象来创建新对象。 结构型模式包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式代理模式适配器模式将一个类的接口转换成客户端期望的接口,桥接模式将抽象和实现分离,组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,装饰器模式动态地给对象添加职责,外观模式为多个子系统提供一个统一的接口,享元模式共享对象以减少内存的使用,代理模式为其他对象提供一个代理以控制对这个对象的访问。 行为型模式包括模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式策略模式、职责链模式和访问者模式模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现,命令模式将请求封装成对象,迭代器模式提供一种方法来顺序访问聚合对象的元素,观察者模式定义对象之间的一对多依赖关系,中介者模式定义了一个封装一组对象交互的对象,备忘录模式在不破坏封装的前提下捕获一个对象的内部状态,解释器模式为语言创建解释器,状态模式允许一个对象在其内部状态改变时改变其行为,策略模式定义了一系列算法,职责链模式将请求的发送者和接收者解耦,访问者模式将算法与数据结构分离开来。 这些设计模式在实际的软件开发中有着广泛的应用,对于提高代码的可重用性、可维护性和可扩展性都具有很好的作用。了解和熟练运用这些设计模式,对于Java开发人员来说是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值