小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习每天小知识。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍创建型设计模式中的原型模式和单例模式。
原型模式
用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。
简单来说就是以一个对象为原型,创建和该对象相同结构的对象。
具体代码:
UML图
原型类
/**
* @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());
}
}
单例模式
- 一个类只有一个实例,并且整个系统都可调用。
- 单例模式只提供私有的构造函数,所以只能本类创建实例。
- 类中定义一个该类的静态私有对象
- 定义一个静态的共有的的函数创建或获取类中的静态私有对象。
具体代码:
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关键字:
- 修饰实例对象:给当前对象实例加锁
- 修饰静态方法:给当前类加锁。
- 修饰代码块:指定加锁对象。可以是对象也可以是类。
结语
以上就是创建型设计模式中的原型模式和单例模式,希望对读者有所帮助。如有不正之处,欢迎读者们批评指正。
欢迎大家点击传送门了解其他的创建型模式: