设计模式-工厂模式与单例模式

一、工厂模式

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂模式完全负责设计原则,降低了对象之间的耦合度。很明显工厂方法模式依赖于抽象的架构,将实例化的任务交由子类去完成,同时也有非常好的拓展性。

先写一个Pizza接口,那么一个香喷喷的Pizza要做好就需要经过如下四个步骤!

public interface Pizza {
	public void prepare();
	public void bake();
	public void cut();
	public void box();
}

两种Pizza供君挑选!
Pizza A~

public class APizza implements Pizza {
	@Override
	public void prepare() {}
	@Override
	public void bake() {}
	@Override
	public void cut() {}
	@Override
	public void box() {
		System.out.println("A ok!");
	}
}

Pizza B~

public class BPizza implements Pizza {
	@Override
	public void prepare() {}
	@Override
	public void bake() {}
	@Override
	public void cut() {}
	@Override
	public void box() {
		System.out.println("B ok!");
	}
}

然后我们要有工厂来生产Pizza,即创建出Pizza的实例!

public class PizzaFactory {
	
	public Pizza createPizza(String type){
		Pizza pizza = null;
		if(type == "A"){
			pizza = new APizza();
		}else if(type == "B"){
			pizza = new BPizza();
		}
		return pizza;
	}
	
}

PizzaStore可以开始营业啦!

public class PizzaStore {

	PizzaFactory pizzaFactory;
	
	//开店的时候初始化我们的工厂!
	public PizzaStore(PizzaFactory pizzaFactory) {
		this.pizzaFactory = pizzaFactory;
	}
	
	//用户点餐就交给工厂去制作!
	public Pizza orderPizza(String type){
		Pizza pizza = pizzaFactory.createPizza(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	
	//测试一下!
	public static void main(String[] args) {
		PizzaStore pizzaStore = new PizzaStore(new PizzaFactory());
		pizzaStore.orderPizza("A");
	}
}

二、单例模式

懒汉式
把自己的构造方法设置为私有的,不让别人访问你的实例,同时提供一个static方法给别人获取你的实例。

public class Single1 {
	
	private static Single1 single1;
	
	private Single1() {
	}
	
	public static Single1 getInstance(){
		if(single1 != null){
			single1 = new Single1();
		}
		return single1;
	}
}

饿汉式
定义了一个静态的final的实例,并且直接new了一个对象,这样就会导致Single2 类在加载字节码到虚拟机的时候就会实例化这个实例,当调用getInstance方法的时候,就会直接返回,不必做任何判断。这样做的好处是代码量明显减少了,坏处是,在没有使用该单例的时候,该单例却被加载了,同时如果该单例很大的话,将会浪费很多的内存。

public class Single2 {
	
	private static final Single2 single2 = new Single2();
	
	private Single2() {
	}
	
	public static Single2 getInstance(){
		return single2;
	}
}

同步懒汉式
使用synchronized关键字,相当于每个想要进入该方法的获取实例的线程都要阻塞,这对性能的影响是巨大的。其实只需要在实例第一次初始化的时候同步就足够了。

public class Single3 {
	
	private static Single3 Single3;
	
	private Single3() {
	}
	
	public synchronized static Single3 getInstance(){
		if(Single3 != null){
			Single3 = new Single3();
		}
		return Single3;
	}
}

双重检验锁
线程第一次进入会阻塞,但相较于同步懒汉式,已经有许多进步了。

public class Single4 {
	
	private static Single4 single4;
	
	private Single4(){}
	
	public static Single4 getInstance(){
		if(single4 == null){
			synchronized (Single4.class){
				if(single4 == null){
					single4 = new Single4();
				}
			}
		}
		return single4;
	}
}

懒加载内部类

public class Single5 {
	
	private static class InnerClass {
		private static final Single5 INSTANCE = new Single5();
	}
	
	private Single5 (){}
	
	public static final Single5 getInstance() {
		return InnerClass.INSTANCE;
	}
}

枚举类型

public enum Single6 {
	INSTANCE;
	public Single6 getInstance() {
		return INSTANCE;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值