【设计模式】创建型(单例、工厂、Builder)

单例模式

懒汉式,线程不安全

//懒汉式--线程不安全
class Singleton{
	private static Singleton uniqueInstance;
	private Singleton(){
		System.out.println("懒汉式--线程不安全");
	}
	public static Singleton getUniqueInstance(){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}
		return uniqueInstance;
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.getUniqueInstance();
	}

}

懒汉式,线程安全,在得到实例的方法上添加synchronized关键字

//懒汉式--线程安全
class Singleton{
	private static Singleton uniqueInstance;
	private Singleton(){
		System.out.println("懒汉式--线程安全");
	}
	public static synchronized Singleton getUniqueInstance(){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}
		return uniqueInstance;
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.getUniqueInstance();
	}

}

饿汉式,线程安全

//饿汉式--线程安全
class Singleton{
	private static Singleton uniqueInstance=new Singleton();
	private Singleton(){
		System.out.println("饿汉式--线程安全");
	}
	public static Singleton getUniqueInstance(){
		return uniqueInstance;
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.getUniqueInstance();
	}

}

双重校验,线程安全

有两个if检验,因为如果两个线程同时执行if,会同时进入if内,虽然if内加锁,但是两个线程都会执行new实例操作(只是先后不同),因此要两个if校验。

用volatile修饰,使多线程情况下指令不会重排。

//双重校验--线程安全
class Singleton{
	private volatile static Singleton uniqueInstance;
	private Singleton(){
		System.out.println("双重校验--线程安全");
	}
	public static  Singleton getUniqueInstance(){
		if(uniqueInstance==null){
			synchronized (Singleton.class) {
				if(uniqueInstance==null){
					uniqueInstance=new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.getUniqueInstance();
	}

}

枚举实现,最佳实现,在面对复杂序列化或者反射攻击的时候,能够防止实例化多次

public class Shejimoshi {
	// 枚举
	public enum Singleton {
		uniqueInstance;
		protected  void read(){
			System.out.println("枚举单例模式");
		}


	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton.uniqueInstance.read();
	}

}

工厂模式

简单工厂,客户类和具体子类解耦

interface Product{
	
}
class ConcreteProduct implements Product{
	public ConcreteProduct(){
		System.out.println("生产");
	}
}
class ConcreteProduct1 implements Product{
	public ConcreteProduct1(){
		System.out.println("生产1");
	}
}
class ConcreteProduct2 implements Product{
	public ConcreteProduct2(){
		System.out.println("生产2");
	}
}
class SimpleFactory{
	public Product createProduct(int type){
		if(type==1){
			return new ConcreteProduct1();
		}else if(type==2){
			return new ConcreteProduct2();
		}
		return new ConcreteProduct();
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SimpleFactory simpleFactory=new SimpleFactory();
		Product product=simpleFactory.createProduct(1);
	}

}

工厂方法,Factory是抽象类

interface Product{
	
}
abstract class Factory{
	abstract public Product factoryMethod();
	public void doSomething(){
		Product product=factoryMethod();
	}
}
class ConcreteProduct extends Factory implements Product{
	public ConcreteProduct(){
		System.out.println("生产");
	}
	@Override
	public Product factoryMethod() {
		// TODO Auto-generated method stub
		return new ConcreteProduct();
	}
}
class ConcreteProduct1 extends Factory implements Product{
	public ConcreteProduct1(){
		System.out.println("生产1");
	}

	@Override
	public Product factoryMethod() {
		// TODO Auto-generated method stub
		return new ConcreteProduct1();
	}
}
class ConcreteProduct2 extends Factory implements Product{
	public ConcreteProduct2(){
		System.out.println("生产2");
	}

	@Override
	public Product factoryMethod() {
		// TODO Auto-generated method stub
		return new ConcreteProduct2();
	}
}
public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Factory factory=new ConcreteProduct1();
	}

}

抽象工厂

class AbstactProductA{}
class AbstactProductB{}
class ProductA1 extends AbstactProductA{
	public ProductA1() {
		System.out.println("生产A1");
	}
}
class ProductA2 extends AbstactProductA{
	public ProductA2() {
		System.out.println("生产A2");
	}
}
class ProductB1 extends AbstactProductB{
	public ProductB1() {
		System.out.println("生产B1");
	}
}
class ProductB2 extends AbstactProductB{
	public ProductB2() {
		System.out.println("生产B2");
	}
}

abstract class AbstractFactory{
	abstract AbstactProductA createProductA();
	abstract AbstactProductB createProductB();
}
class ConcreteFactory1 extends AbstractFactory{

	@Override
	AbstactProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA1();
	}

	@Override
	AbstactProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB1();
	}
}
class ConcreteFactory2 extends AbstractFactory{

	@Override
	AbstactProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA2();
	}

	@Override
	AbstactProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB2();
	}
	
}

public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractFactory abstractFactory=new ConcreteFactory1();
		AbstactProductA productA=abstractFactory.createProductA();
	}

}

Builder模式

内部静态类

class Student {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	static class Builder {
		private Student student = new Student();

		public Builder setId(int id) {
			student.id = id;
			return this;
		}

		public Builder setName(String name) {
			student.name = name;
			return this;
		}

		public Student builder() {
			return student;
		}
	}

}

public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student.Builder builder = new Student.Builder();
		Student student = builder.setId(110).setName("zhangsan").builder();
	}

}

原型模式

使用原型实例指定要创建的对象类型,通过复制这个原型来创建新对象。

abstract class Prototype{
	abstract Prototype myClone();
}
class ConcretePrototype extends Prototype{
	private String filed;
	public ConcretePrototype(String filed){
		this.filed=filed;
	}
	@Override
	Prototype myClone() {
		// TODO Auto-generated method stub
		return new ConcretePrototype(filed);
	}
	public String toString(){
		return filed;
	}
}

public class Shejimoshi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Prototype prototype=new ConcretePrototype("abd");
		Prototype clone=prototype.myClone();
		System.out.println(clone.toString());
	}

}


猜你喜欢

转载自blog.csdn.net/wenyimutouren/article/details/80872341