• 23种设计模式-Java语言实现


    因为要准备一个考试所以又重新接触到了设计模式,之前只是别人说什么就是什么,记下就好了,完全不理解其中的思想以及为什么要用(虽然现在也不太理解…) 先慢慢总结吧,常读常新。

    23种设计模式

    “每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
    
    • 1

    总览
    在这里插入图片描述

    (1)创建型设计模式(5种)

    • 抽象工厂模式
      思想: 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

    实例:对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,都是成套的,即一系列具体产品。假设一种情况,在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用OO的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

    结构:
    在这里插入图片描述
    其中

    • AbstractFactory声明一个创建抽象产品对象的操作接口。ConcreteFactory 实现创建具体产品对象的操作。
    • AbstractProduct为一类产品对象声明一个接口。
    • ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口。
    • Client仅使用由AbstractFactory和 AbstractProduct类声明的接口。
      Java代码实现:
    public class AbstractFactory {
        public static void main(String[] args) {
            Factory factory1 = new Factory1();
    
            ProductA productA = factory1.createProductA();
            productA.info();
    
            Factory factory2 = new Factory2();
    
            ProductB productB = factory2.createProductB();
            productB.info();
        }
    }
    
    interface Factory {
        public ProductA createProductA();
        public ProductB createProductB();
    }
    
    class Factory1 implements Factory {
    
        @Override
        public ProductA createProductA() {
            return new ProductA1();
        }
    
        @Override
        public ProductB createProductB() {
            return new ProductB1();
        }
    }
    
    class Factory2 implements Factory {
    
        @Override
        public ProductA createProductA() {
            return new ProductA2();
        }
    
        @Override
        public ProductB createProductB() {
            return new ProductB2();
        }
    }
    
    interface ProductA {
        public void info();
    }
    
    class ProductA1 implements ProductA {
    
        @Override
        public void info() {
            System.out.println("产品的信息:A1");
        }
    }
    
    class ProductA2 implements ProductA {
    
        @Override
        public void info() {
            System.out.println("产品的信息:A2");
        }
    }
    
    interface ProductB {
        public void info();
    }
    
    class ProductB1 implements ProductB {
    
        @Override
        public void info() {
            System.out.println("产品的信息:B1");
        }
    }
    
    class ProductB2 implements ProductB {
    
        @Override
        public void info() {
            System.out.println("产品的信息:B2");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 工厂方法模式
      思想:在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
      实例:如果需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。而至于需要哪个牌子的汽车,就到哪个牌子的工厂。这个是用的最多的,仔细看下结构应该能理解。
      结构:
      在这里插入图片描述
      在这里插入图片描述
      代码实现:
    public class FactoryMethod {
        public static void main(String[] args) {
            Factory factoryA = new FactoryA();
            // 父类 对象名 = new 子类();
    
            Product productA = factoryA.createProduct();
            // Product productA = new ProductA();
            productA.info();
    
            Factory factoryB = new FactoryB();
    
            Product productB = factoryB.createProduct();
            productB.info();
        }
    }
    
    // class Factory
    interface Factory {
        public Product createProduct();
    }
    
    class FactoryA implements Factory {
    
        @Override
        public Product createProduct() {
            return new ProductA();
        }
    }
    
    class FactoryB implements Factory {
    
        @Override
        public Product createProduct() {
            return new ProductB();
        }
    }
    
    // abstract class Product
    interface Product {
        // public abstract void info();
        public void info();
    }
    
    // class ProductA extends Product
    class ProductA implements Product {
    
        @Override
        public void info() {
            System.out.println("产品的信息:A");
        }
    }
    
    // class ProductB extends Product
    class ProductB implements Product {
    
        @Override
        public void info() {
            System.out.println("产品的信息:B");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 单例模式
      思想:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。包括懒汉式和饿汉式。

    实例:一个学校只能有一个校长,一个数据库只能有一个数据源

    结构:
    在这里插入图片描述
    代码实现:

    public class SingletonPattern {
        public static void main(String[] args) {
            // Singleton singleton1 = new Singleton();
    
            Singleton singleton1 = Singleton.getInstance();
            Singleton singleton2 = Singleton.getInstance();
            Singleton singleton3 = Singleton.getInstance();
    
            System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());
    
            singleton1.setNumber(528);
            System.out.println(singleton1.getNumber() + " " + singleton2.getNumber() + " " + singleton3.getNumber());
    
        }
    }
    
    class Singleton {
        private int number = 2023;
    
        public void setNumber(int number) {
            this.number = number;
        }
    
        public int getNumber() {
            return number;
        }
    
        private static Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 原型模式
      思想:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。也就是用来克隆对象。

    实例:1、细胞分裂;2、Java中的 Object clone() 方法。

    结构:
    在这里插入图片描述
    在这里插入图片描述
    代码实现:

    public class Main {
        public static void main(String[] args) {
            Product product1 = new Product(2022, 5.28);
            System.out.println(product1.getId() + " " + product1.getPrice());
    
            // Product product2 = new Product(2022, 5.28);
            Product product2 = (Product) product1.Clone();
            System.out.println(product2.getId() + " " + product2.getPrice());
    
            Product product3 = (Product) product1.Clone();
            System.out.println(product3.getId() + " " + product3.getPrice());
        }
    }
    
    interface Prototype {
        public Object Clone();
    }
    
    class Product implements Prototype {
        private int id;
        private double price;
    
        public Product() {}
    
        public Product(int id, double price) {
            this.id = id;
            this.price = price;
        }
    
        public int getId() {
            return id;
        }
    
        public double getPrice() {
            return price;
        }
    
        @Override
        public Object Clone() {
            Product object = new Product();
            object.id = this.id;
            object.price = this.price;
    
            return object;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 生成器模式:
      思想:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    实例:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的“套餐”;

    在这里插入图片描述
    在这里插入图片描述
    代码实现:

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Director director = new Director();
    
            Builder builder1 = new Builder1();
            director.Construct(builder1);
            Product product1 = builder1.getResult();
            product1.show();
    
            Builder builder2 = new Builder2();
            director.Construct(builder2);
            Product product2 = builder2.getResult();
            product2.show();
        }
    }
    
    class Director {
        public void Construct(Builder builder) {
            builder.BuildPart();
        }
    }
    
    abstract class Builder {
        public abstract void BuildPart();
        public abstract Product getResult();
    }
    
    class Builder1 extends Builder {
        Product product = new Product();
    
        @Override
        public void BuildPart() {
            product.Add("A");
            product.Add("B");
            product.Add("C");
            product.Add("D");
            product.Add("E");
            product.Add("F");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
    class Builder2 extends Builder {
        Product product = new Product();
    
        @Override
        public void BuildPart() {
            product.Add("A");
            product.Add("B");
            product.Add("C");
        }
    
        @Override
        public Product getResult() {
            return product;
        }
    }
    
    class Product {
        List<String> parts = new ArrayList<String>();
    
        public void Add(String part) {
            parts.add(part);
        }
    
        public void show() {
            System.out.print("产品的组成:");
            for (String s : parts)
                System.out.print(s + " ");
    
            System.out.print("\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    剩下的等以后再继续填坑吧!

  • 相关阅读:
    【历史上的今天】9 月 19 日:世界上第一个表情符号;微软发布 Virtual PC;苹果 UI 扁平化的开始
    Nginx的https功能
    计算机专业毕业论文java毕业设计开题报告精品基于SSM的社区疫情防控平台[包运行成功]
    unity中的常用属性修饰符
    ASP.NET Core教程
    Java SE中的运算符讲解
    【Python基础】if __name__ == ‘__main__‘:和assert函数
    xml 解析技术介绍和解析xml文件
    现代综合农业拒接形式推广-国稻种芯:谋定关键产业突破口
    上半年Java面试真题整理,一共343道,每一题都很经典,上半年就有89人拿到offer
  • 原文地址:https://blog.csdn.net/qq_44727672/article/details/134199803