深入浅出细说创建型模式(三)--原型和单例模式

1,405 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

 每天一小步,成功一大步。大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习每天小知识。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

 本文主要介绍创建型设计模式中的原型模式和单例模式。

原型模式

用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。

简单来说就是以一个对象为原型,创建和该对象相同结构的对象。

具体代码:

UML图

image.png

原型类

 /**
  * @author Gw_gw
  */
 public class AbstractCar implements Cloneable{
     String carName;
     public String getCarName() {
         return carName;
     }
 ​
     public void setCarName(String carName) {
         this.carName = carName;
     }
     @Override
     public Object clone(){
         Object object = null;
         try{
             object = super.clone();
         }catch(CloneNotSupportedException e){
             System.out.println("AbstractCar is not Cloneable");
         }
         return object;
     }
 }

克隆类:

 public class BWMCar extends AbstractCar{
     public BWMCar(){
         setCarName("BWM car");
     }
 }
 public class BenzCar extends AbstractCar{
     public BenzCar() {
         setCarName("Benz Car");
     }
 }

Test

 public class PrototypePatternTest {
     public static void main(String[] args) {
         AbstractCar bwmCar = new BWMCar();
         AbstractCar benzCar = new BenzCar();
         System.out.println(bwmCar.getCarName());
         System.out.println(benzCar.getCarName());
     }
 }

image.png

单例模式

  • 一个类只有一个实例,并且整个系统都可调用。
  • 单例模式只提供私有的构造函数,所以只能本类创建实例。
  • 类中定义一个该类的静态私有对象
  • 定义一个静态的共有的的函数创建或获取类中的静态私有对象。

具体代码:

 public class Singleton {
     /**
      * Private constructor
      */
     private Singleton() {
     }
     /**
      * Create private static objects
      */
     private static volatile Singleton instance = null;
     /**
      * Create public static methods to
      * access or create private objects
      */
     public static Singleton getInstance(){
         //如果对象没有被实例化,就给对象加锁
         if(instance == null){
             synchronized (Singleton.class){
                 if(instance == null){
                     instance = new Singleton();
                 }
             }
         }
         return instance;
     }
 }
 ​

volatile关键字:

  • 保证了不同线程对该变量进型操作时的可见性。如果某一个线程修改了该变量的值,其他线程立即可见。
  • 禁止指令重排序

synchronized关键字:

  • 修饰实例对象:给当前对象实例加锁
  • 修饰静态方法:给当前类加锁。
  • 修饰代码块:指定加锁对象。可以是对象也可以是类。

结语

以上就是创建型设计模式中的原型模式和单例模式,希望对读者有所帮助。如有不正之处,欢迎读者们批评指正。

欢迎大家点击传送门了解其他的创建型模式:

深入浅出细说创建型设计模式(一)

深入浅出细说创建型设计模式(二)--生成器模式