java设计模式;直接上代码;

一、单例模式

package mode;
//懒汉 饿汉 匿名内部类
public class Singleton {

	// 第一种(懒汉,线程不安全)
	/*
	 * private static Singleton singleton;
	 * 
	 * private Singleton(){}
	 * 
	 * public static Singleton getInstance(){ if(singleton == null){ singleton =
	 * new Singleton(); } return singleton; }
	 */

	// 第二种(懒汉,线程安全) 99%情况下不需要同步、效率很低
	/*
	 * private static Singleton instance;
	 * 
	 * private Singleton (){}
	 * 
	 * public static synchronized Singleton getInstance() { if (instance ==
	 * null) { instance = new Singleton(); } return instance; }
	 */

	// 第三种  饿汉 没有达到单例的效果 可以会有其他原因导致类装载
	/*
	 * private static Singleton instance = new Singleton();
	 * 
	 * private Singleton(){}
	 * 
	 * public static Singleton getInstance(){ return instance; }
	 */
	
	//第四种 和第三种差不多
	/*private static Singleton instance = null;  
	  static {
		instance = new Singleton();
	  }

	  private Singleton() {
	  }

	  public static Singleton getInstance() {  
	    return instance;  
	  }*/
	
	//第五种 匿名内部类
	/*private static class SingletonHolder{
		private static final Singleton INSTANCE = new Singleton();
	}
	
	  private Singleton(){}
	
	  public static Singleton getInstance(){
		return SingletonHolder.INSTANCE;
	  }*/

}
package mode;
//枚举
public enum Singleton1 {

	INSTANCE;  
    public void whateverMethod() {  

    }  
}
package mode;
//双重校验锁
public class Singleton2 {
	
	private volatile static Singleton2 singleton2;
	
	private Singleton2(){}
	
	public static Singleton2 getInstance(){
		if(singleton2 == null){
			synchronized (Singleton2.class) {
				if(singleton2 == null){
					singleton2 = new Singleton2();
				}
			}
		}
		return singleton2;
	}

}

二、工厂方法模式

package product;

public interface Logger {
	
	public void writeLogger();

}
package product;

public class FileLogger implements Logger{

	@Override
	public void writeLogger() {
		System.out.println("文件日志系统");
	}

	
}
package product;

public class DatabaseLogger implements Logger{

	@Override
	public void writeLogger() {
		System.out.println("数据库日志系统"); 
	}

}
package factory;

import product.Logger;

public interface LoggerFactory {
	
	public Logger createLogger(); 

}

package factory;

import product.FileLogger;
import product.Logger;

public class FileLoggerFactory implements LoggerFactory{

	@Override
	public Logger createLogger() {
		Logger logger = new FileLogger();
		return logger;
	}

}
package factory;

import product.DatabaseLogger;
import product.Logger;

public class DatabaseLoggerFactory implements LoggerFactory{

	@Override
	public Logger createLogger() {
		Logger logger = new DatabaseLogger();
		return logger;
	}

}
package factory;

import product.Logger;

public class Client {
	
	public static void main(String[] args) {
		LoggerFactory loggerFactory = new DatabaseLoggerFactory();
		Logger logger = loggerFactory.createLogger(); 
		logger.writeLogger();
		
		LoggerFactory loggerFactory2 = new FileLoggerFactory();
		Logger logger2 = loggerFactory2.createLogger();
		logger2.writeLogger();
	}

}

三、抽象工厂模式

package abstract1;

public interface Fruit {
	
	public void get();

}

package abstract1;

public abstract class Apple implements Fruit{
	
	public abstract void get();
	
}
package abstract1;

public abstract class Banana implements Fruit{
	
	public abstract void get();
	
}
package abstract1;

public class ChinaApple extends Apple{

	@Override
	public void get() {
		System.out.println("中国苹果");
	}

}
package abstract1;

public class ChinaBanana extends Banana{

	@Override
	public void get() {
		System.out.println("中国香蕉");
	}

}
package abstract1;

public interface FruitFactory {
	
	//实例化苹果
	public Fruit getApple();
	
	//实例化香蕉
	public Fruit getBanana();

}
package abstract1;

public class ChinaFactory implements FruitFactory{

	@Override
	public Fruit getApple() {
		return new ChinaApple();
	}

	@Override
	public Fruit getBanana() {
		return new ChinaBanana();
	}

}
package abstract1;

public class EnglandApple extends Apple{

	@Override
	public void get() {
		System.out.println("英国苹果");
	}

}
package abstract1;

public class EnglandBanana extends Banana{

	@Override
	public void get() {
		System.out.println("英国香蕉");
	}

}
package abstract1;

public class EnglandFactory implements FruitFactory{

	@Override
	public Fruit getApple() {
		return new EnglandApple();
	}

	@Override
	public Fruit getBanana() {
		return new EnglandBanana();
	}

}
package abstract1;

public class MainClass {
	
	public static void main(String[] args) {
		FruitFactory fruitFactory = new ChinaFactory();
		Fruit apple = fruitFactory.getApple();
		apple.get();
		Fruit banana = fruitFactory.getBanana();
		banana.get();
		
		
		FruitFactory fruitFactory2 = new EnglandFactory();
		Fruit apple2 = fruitFactory2.getApple();
		apple2.get();
		Fruit banana2 = fruitFactory2.getBanana();
		banana2.get();
		
		
	}

}

四、建造者模式

package builder;

/**
 * Builder.java
 *  建造者
 */
abstract class Builder {
    //地基
    abstract void bulidA();
    //钢筋工程
    abstract void bulidB();
    //铺电线
    abstract void bulidC();
    //粉刷
    abstract void bulidD();
    //完工-获取产品
    abstract Product getProduct();
}
package builder;

/**
 * Product.java
 *  产品(房子)
 */
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;
    public String getBuildA() {
        return buildA;
    }
    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }
    public String getBuildB() {
        return buildB;
    }
    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }
    public String getBuildC() {
        return buildC;
    }
    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }
    public String getBuildD() {
        return buildD;
    }
    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }
    @Override
        public String toString() {
            return buildA+"\n"+buildB+"\n"+buildC+"\n"+buildD+"\n"+"房子验收完成";
        }
}

package builder;

/**
 * ConcreteBuilder.java
 *  具体建造者(工人)
 */
public class ConcreteBuilder extends Builder{
    private Product product;
    public ConcreteBuilder() {
        product = new Product();
    }
    @Override
    void bulidA() {
        product.setBuildA("地基");
    }
    @Override
    void bulidB() {
        product.setBuildB("钢筋工程");
    }
    @Override
    void bulidC() {
        product.setBuildC("铺电线");
    }
    @Override
    void bulidD() {
        product.setBuildD("粉刷");
    }
    @Override
    Product getProduct() {
        return product;
    }
}
package builder;

/**
 * Director.java
 *  指挥者
 */
public class Director {
    //指挥工人按顺序造房
    public Product create(Builder builder) {
        builder.bulidA();
        builder.bulidB();
        builder.bulidC();
        builder.bulidD();
        return builder.getProduct();
    }
}
package builder;

/**
 * Test.java
 *  测试类
 */
public class Test {
    public static void main(String[] args) {
        Director director = new Director();
        Product create = director.create(new ConcreteBuilder());
        System.out.println(create.toString());
    }
}

五、原型模式

  1. 浅克隆
package prototypePattern;
/**
* <p>Title: Attachment</p>  
* <p>Description:附件类 </p>  
*/
 
public class Attachment {
 private String name;	//附件名
 
public String getName() {
	return name;
}
 
public void setName(String name) {
	this.name = name;
}
 public void download() {
	 System.out.println("下载附件"+name);
 }
}
package prototypePattern;
/**
* <p>Title: WeeklyLog</p>  
* <p>Description:周报类充当具体的原型类 </p>  
*/
public class WeeklyLog implements Cloneable{
	
	private Attachment attachment;
	private String date;
	private String name;
	private String content;
	public Attachment getAttachment() {
		return attachment;
	}
	public void setAttachment(Attachment attachment) {
		this.attachment = attachment;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	//实现clone()方法实现浅克隆
	public WeeklyLog clone() {
		//需要实现cloneable的接口,直接继承object就好,它里面自带一个clone方法!
		Object obj = null;
		try {
			obj = super.clone();
			return (WeeklyLog)obj;
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			System.out.println("不支持克隆方法!");
			return null;
		}
		
		
	}
}
package prototypePattern;                                                                                  
                                                                                                           
public class Client {                                                                                      
    //测试类,客户端                                                                                              
	public static void main(String[] args) {                                                               
		WeeklyLog log_1,log_2;                                                                             
		log_1 = new WeeklyLog();	//创建原型对象                                                               
		Attachment attachment = new Attachment(); //创建附件对象                                                 
		log_1.setAttachment(attachment);	//将附件添加到周报种去                                                   
		log_2=log_1.clone();	//克隆周报                                                                     
		System.out.println("周报是否相同"+(log_1==log_2));                                                       
		System.out.println("附件是否相同"+(log_1.getAttachment()==log_2.getAttachment()));                       
	}                                                                                                      
}                                                                                                          

2.深克隆

package prototypePattern;
 
import java.io.Serializable;
 
/**
* <p>Title: Attachment</p>  
* <p>Description:附件类 </p>  
*/
 
public class Attachment_2 implements Serializable {
 private String name;	//附件名
 
public String getName() {
	return name;
}
 
public void setName(String name) {
	this.name = name;
}
 public void download() {
	 System.out.println("下载附件"+name);
 }
}
package prototypePattern;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
 
/**
* <p>Title: WeeklyLog</p>  
* <p>Description:周报类充当具体的原型类 </p>  
*/
public class WeeklyLog_2 implements Serializable{
	
	private Attachment_2 attachment;
	private String date;
	private String name;
	private String content;
	public Attachment_2 getAttachment() {
		return attachment;
	}
	public void setAttachment(Attachment_2 attachment) {
		this.attachment = attachment;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	//通过序列化进行深克隆
	public WeeklyLog_2 deepclone() throws Exception {
		//将对象写入流中,
		ByteArrayOutputStream bao = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bao);
		oos.writeObject(this);
		//将对象取出来
		ByteArrayInputStream bi = new ByteArrayInputStream(bao.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bi);
		return (WeeklyLog_2)ois.readObject();
		
		
	}
}
package prototypePattern;                                                                                  
                                                                                                           
public class Client_2 {                                                                                      
    //测试类,客户端                                                                                              
	public static void main(String[] args) {                                                               
		WeeklyLog_2 log_1,log_2=null;                                                                             
		log_1 = new WeeklyLog_2();	//创建原型对象                                                               
		Attachment_2 attachment = new Attachment_2(); //创建附件对象                                                 
		log_1.setAttachment(attachment);	//将附件添加到周报种去                                                   
		try {
			log_2=log_1.deepclone();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	//克隆周报                                                                     
		System.out.println("周报对象是否相同"+(log_1==log_2));                                                     
		System.out.println("附件对象是否相同"+(log_1.getAttachment()==log_2.getAttachment()));                     
	}                                                                                                      
}                                                                                                          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值