美文网首页Java设计模式Java学习笔记
五分钟快速入门单例、简单工厂、工厂方法三种设计模式

五分钟快速入门单例、简单工厂、工厂方法三种设计模式

作者: 视野跳动 | 来源:发表于2017-12-11 17:59 被阅读25次

前言:设计模式的概念是很抽象的,不好理解,我第一次看完这些概念也是一面懵逼,又想了想,还是一面懵逼的。在这里将概念放在前面看不懂没关系,本章的正确学习方式应该是先看《案例演示》和《代码实现》然后再回头看概念(别看概念很难理解,其实都是纸老虎,将demo敲一遍,不懂,拿刀来砍我)

前言 :虽然有六大设计原则,二十三种设计模式,不过常见的设计模式也就那么几种,想要真正的掌握,肯定还需要我们结合具体的应用场景去练习去理解,方可应用!

一、单例设计模式

  • A:单例设计模式:保证类在内存中只有一个对象。

  • B:如何保证类在内存中只有一个对象呢?

    • (1)构造方法私有化(控制类的创建,不让其他类来创建本类的对象)。private
    • (2)在本类中定义一个本类的对象。Singleton s;
    • (3)提供公共的访问方式。 public static Singleton getInstance(){return s}
  • C:单例的两种写法

    • 饿汉模式,开发用这种方式
    class Singleton {
                    //1,私有构造函数
                    private Singleton(){}
                    //2,创建本类对象
                    private static Singleton s = new Singleton();
                    //3,对外提供公共的访问方法
                    public static Singleton getInstance() {
                        return s;
                    }
                    
                    public static void print() {
                        System.out.println("11111111111");
                    }
                }
    
    • 懒汉式,面试的时候写这种方式。但是建议不要在项目中使用,因为他存在多线程问题。
              //懒汉式,又称单例的延迟加载模式
                  class Singleton {
                      //1,私有构造函数
                      private Singleton(){}
                      //2,声明一个本类的引用
                      private static Singleton s;
                      //3,对外提供公共的访问方法
                      public static Singleton getInstance() {
                          if(s == null)
                              //线程1,线程2
                              s = new Singleton();
                          return s;
                      }
                      
                      public static void print() {
                          System.out.println("11111111111");
                      }
                  }
    

    线程安全问题: 多线程中,在创建单例对象的时候,假如线程1,经过if判断时没有创建对象,假如此时还没有执行s = new Singleton();时,执行权被线程2抢过去了,那么线程2在if判断时,s的对象仍然是null,如果此时线程2通过了判断。线程1又有了执行权,那么线程1和线程2都可以去创建s对象了,如果是这样这还是单例模式吗?所以建议使用饿汉模式。如果还不理解可以参考一下我写的《搞定Java多线程(三)》中的线程安全。

    • 第三种格式(了解)
    class Singleton {
                private Singleton() {}
            
                public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
            }
    

二、简单工厂设计模式

  • A:简单工厂模式概述

    • 又叫静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例
  • B:优点

    • 客户端不需要在负责对象的创建,从而明确了各个类的职责
  • C:缺点

    • 这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护
  • D:案例演示

    • 动物抽象类:
    public abstract Animal {
        public abstract void eat(); 
        
    }
    
    • 具体狗类:
    public class Dog extends Animal {
         @Override
        public void eat() {
            System.out.println("狗喜欢吃骨头");
        }
    }
    
    • 具体猫类:
    public class Cat extends Animal {
         @Override
        public void eat() {
         System.out.println("猫喜欢吃鱼");
        }
    }
    
    • 工厂类(在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就知道了一个专门的类来创建对象。)
    public class AnimalFactory {
                private AnimalFactory(){}
            
                public static Dog createDog() {return new Dog();}
                public static Cat createCat() {return new Cat();}
            
                //改进
                /*public static Animal createAnimal(String animalName) {
                    if(“dog”.equals(animalName)) {}
                    else if(“cat”.equals(animale)) {
            
                    }else {
                        return null;
                    }
                }*/
            } 
    
    • 主方法,创建类的实例
    public class Main {
        public static void main(String[] args) {
            Dog dog = AnimalFactory.createDog();
            dog.eat();
            Cat cat = AnimalFactory.createCat();
            cat.eat();
           //改进
        //Dog dog = AnimalFactory.createAnimal("dog");
        }
    }
    
    • 运行结果


      简单工厂.png

三、工厂方法设计模式

  • A:工厂方法模式概述

    • 工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。
  • B:优点

    • 客户端不需要在负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性
  • C:缺点

    • 需要额外的编写代码,增加了工作量
  • D:案例演示

    • 动物抽象类:
    public abstract Animal { 
        public abstract void eat(); 
         }
    
    • 工厂接口:
    public interface Factory {
        public abstract Animal createAnimal();
            }
    
    • 具体狗类:
    public class Dog extends Animal {
             @Override
             public void eat() {
                 System.out.println("狗喜欢吃骨头");
             }
         }
    
    • 具体猫类:
    public class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("猫喜欢吃鱼");
        }
    }
    
    • 在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就知道了一个专门的类来创建对象。发现每次修改代码太麻烦,用工厂方法改进,针对每一个具体的实现提供一个具体工厂。
    • 狗工厂:
    public class DogFactory implements Factory {
        @Override
            public Animal createAnimal() {
                  return new Dog();
            }
    }
    
    • 猫工厂:
    public class CatFactory implements Factory {
        @Override
            public Animal createAnimal() {
                return new Cat();
        }
    }  
    
    • 主方法,创建类的实例
    public static void main(String[] args) {
      DogFactory dogFactory = new DogFactory();
      Dog dog = (Dog) dogFactory.createAnimal();
      dog.eat();
    }
    
    • 运行结果


      工厂方法.png

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 三、创建型模型

    简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 1.简单工厂模式 简单工厂模式并不属于23种设计模式。 不难看...

  • 设计模式系列-简单工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 定义 简单工厂模式又叫做静态工厂方法模式...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 创建型模式

    工厂模式(简单工厂(不属于23种设计模式)、工厂方法、抽象工厂) 建造者模式 单例模式 原型模式 1.简单工厂(静...

  • 设计模式系列-抽象工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 抽象工厂模式 抽象工厂模式 定义 抽象工...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • 建造模式

    包括:简单工厂、工厂方法、抽象工厂、单例模式、多例模式、建造模式、原始原型模式。 简单工厂:又名静态工厂方法模式,...

  • 设计模式的基本概念与区别

    1、设计模式有哪些? 23种设计模式总体分为三大类创建型设计模式,共5种简单工厂、工厂方法模式,抽象工厂模式,单例...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

网友评论

    本文标题:五分钟快速入门单例、简单工厂、工厂方法三种设计模式

    本文链接:https://www.haomeiwen.com/subject/ksyuixtx.html