一、单例模式
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());
}
}
五、原型模式
- 浅克隆
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()));
}
}