• Java设计模式之单例模式、工厂模式、PO模式【多测师_王sir】


    一)、工厂模式
    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的
    设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使
    其创建过程延迟到子类进行。
    实现:
    我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
    FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。
    它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便
    获取它所需对象的类型。

    步骤 1
    创建一个接口:
    Shape.java
    public interface Shape {
       void draw();
    }
    步骤 2
    创建实现接口的实体类。
    Rectangle.java
    public class Rectangle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Inside Rectangle::draw() method.");
       }
    }
    Square.java
    public class Square implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Inside Square::draw() method.");
       }
    }
    Circle.java
    public class Circle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Inside Circle::draw() method.");
       }
    }
    步骤 3
    创建一个工厂,生成基于给定信息的实体类的对象。
    ShapeFactory.java
    public class ShapeFactory {
        
       //使用 getShape 方法获取形状类型的对象
       public Shape getShape(String shapeType){
          if(shapeType == null){
             return null;
          }        
          if(shapeType.equalsIgnoreCase("CIRCLE")){
             return new Circle();
          } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
             return new Rectangle();
          } else if(shapeType.equalsIgnoreCase("SQUARE")){
             return new Square();
          }
          return null;
       }
    }
    步骤 4
    使用该工厂,通过传递类型信息来获取实体类的对象。
    FactoryPatternDemo.java
    public class FactoryPatternDemo {
     
       public static void main(String[] args) {
          ShapeFactory shapeFactory = new ShapeFactory();
     
          //获取 Circle 的对象,并调用它的 draw 方法
          Shape shape1 = shapeFactory.getShape("CIRCLE");
     
          //调用 Circle 的 draw 方法
          shape1.draw();
     
          //获取 Rectangle 的对象,并调用它的 draw 方法
          Shape shape2 = shapeFactory.getShape("RECTANGLE");
     
          //调用 Rectangle 的 draw 方法
          shape2.draw();
     
          //获取 Square 的对象,并调用它的 draw 方法
          Shape shape3 = shapeFactory.getShape("SQUARE");
     
          //调用 Square 的 draw 方法
          shape3.draw();
       }
    }
    步骤 5
    执行程序,输出结果:
    Inside Circle::draw() method.
    Inside Rectangle::draw() method.
    Inside Square::draw() method.
    二)、单例模式
    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型
    的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单
    个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访
    问,不需要实例化该类的对象。
    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。
    
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
    注意事项:
    getInstance() 方法中需要使用同步锁 synchronized (Singleton.class)
     防止多线程同时进入造成 instance 被多次实例化。
    
    实现
    我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数
    和本身的一个静态实例。
    SingleObject 类提供了一个静态方法,供外界获取它的静态实例。
    SingletonPatternDemo,我们的演示类使用 SingleObject 类来
    获取 SingleObject对象。

    步骤 1
    创建一个 Singleton 类。
    SingleObject.java
    public class SingleObject {
     
       //创建 SingleObject 的一个对象
       private static SingleObject instance = new SingleObject();
     
       //让构造函数为 private,这样该类就不会被实例化
       private SingleObject(){}
     
       //获取唯一可用的对象
       public static SingleObject getInstance(){
          return instance;
       }
     
       public void showMessage(){
          System.out.println("Hello World!");
       }
    }
    步骤 2
    从 singleton 类获取唯一的对象。
    SingletonPatternDemo.java
    public class SingletonPatternDemo {
       public static void main(String[] args) {
     
          //不合法的构造函数
          //编译时错误:构造函数 SingleObject() 是不可见的
          //SingleObject object = new SingleObject();
     
          //获取唯一可用的对象
          SingleObject object = SingleObject.getInstance();
     
          //显示消息
          object.showMessage();
       }
    }
    步骤 3
    执行程序,输出结果:
    Hello World!
  • 相关阅读:
    COCI 2018/2019 CONTEST #2 Solution
    点分治学习笔记
    【Treap 例题】神秘岛(island)
    【暴力Treap 或 离线归并】子串计数(genies)
    【拓扑 字符串还原 + 线段树维护】奇洛金卡达(father)
    UVA 10217 A Dinner with Schwarzenegger!!!---数学
    URAL-1018 Binary Apple Tree---树形DP
    ZOJ-3278 8G Island---二分第k大
    UVA-1152-4 Values whose Sum is 0---中途相遇法
    SGU---462 Electrician 最大生成树
  • 原文地址:https://www.cnblogs.com/xiaoshubass/p/13280618.html
Copyright © 2020-2023  润新知