定义
代码
/** * 单例模式-饿汉形式 * @author emma_zhang * @date 2019/2/15 */ public class SingletonForHunger { private static final SingletonForHunger SINGLETON_FOR_HUNGER = new SingletonForHunger(); private SingletonForHunger() { // 限制产生多个实例 } /** * 访问实例 */ public static SingletonForHunger getSingletonForHunger() { return SINGLETON_FOR_HUNGER; } public static void doSomething() { // 其他方法,尽量使用static } } /** * 单例模式-懒汉形式 * * @author emma_zhang * @date 2019/2/15 */ public class SingletonForLazy { private static SingletonForLazy singletonForLazy = null; private SingletonForLazy() { // 限制产生多个对象 } /** * 产生实例对象,必须要加同步,不然在多线程下可能出错 * * @return 实例对象 */ public synchronized static SingletonForLazy getSingletonForLazy() { if (singletonForLazy == null) { singletonForLazy = new SingletonForLazy(); } return singletonForLazy; } }
使用场景
定义
通用源码
/** * 抽象产品类 * @author emma_zhang * @date 2019/2/18 */ public abstract class Product { /** * 产品的公共方法 */ public void method(){ } /** * 抽象方法 */ public abstract void method2(); } /** * 具体产品类 * * @author emma_zhang * @date 2019/2/18 */ public class ConcreteProduct1 extends Product { @Override public void method2() { } } /** * 抽象工厂类 * * @author emma_zhang * @date 2019/2/18 */ public abstract class Creator { /** * 输入参数可以自行匹配,通常为string,enum,class等 * * @param c * @param <T> * @return */ public abstract <T extends Product> T createProduct(Class<T> c); } /** * 具体工厂类 * * @author emma_zhang * @date 2019/2/18 */ public class ConcreteCreator extends Creator { @Override public <T extends Product> T createProduct(Class<T> c) { Product product = null; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (Exception e) { // 处理异常 e.printStackTrace(); } return (T)product; } } /** * 场景类 * * @author emma_zhang * @date 2019/2/18 */ public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreator(); Product product = creator.createProduct(ConcreteProduct1.class); // 继续业务处理 } }
应用场景
扩展
定义
通用源码
/** * 抽象产品类 * * @author emma_zhang * @date 2019/2/19 */ public abstract class AbstractProductA { public void sharedMethod() { // 每个产品共有的方法 } /** * 共有的方法,但不同的实现 */ public abstract void doSomething(); } /** * 产品A1的实现类 * * @author emma_zhang * @date 2019/2/19 */ public class ProductA1 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A1的实现方法"); } } /** * 产品A2的实现类 * * @author emma_zhang * @date 2019/2/19 */ public class ProductA2 extends AbstractProductA { @Override public void doSomething() { System.out.println("产品A2的实现类"); } } /** * 抽象产品类 * * @author emma_zhang * @date 2019/2/19 */ public abstract class AbstractProductB { public void sharedMethod() { // 每个产品共有的方法 } /** * 共有的方法,但不同的实现 */ public abstract void doSomething(); } /** * 产品B1的实现类 * * @author emma_zhang * @date 2019/2/19 */ public class ProductB1 extends AbstractProductB { @Override public void doSomething() { System.out.println("产品B1的实现方法"); } } /** * 产品B2的实现类 * * @author emma_zhang * @date 2019/2/19 */ public class ProductB2 extends AbstractProductB { @Override public void doSomething() { System.out.println("产品B2的实现类"); } } /** * 抽象工厂 * * @author emma_zhang * @date 2019/2/19 */ public abstract class AbstractCreator { /** * 构建产品A * * @return 产品A */ public abstract AbstractProductA createProductA(); /** * 构建产品B * * @return 产品B */ public abstract AbstractProductB createProductB(); } /** * 产品等级1的实现 * * @author emma_zhan * @date 2019/2/19 */ public class Creator1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } } /** * 产品等级2的实现 * * @author emma_zhang * @date 2019/2/19 */ public class Creator2 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } } /** * 场景类 * * @author emma_zhang * @date 2019/2/19 */ public class Client { public static void main(String[] args) { AbstractCreator creator1 = new Creator1(); AbstractCreator creator2 = new Creator2(); AbstractProductA a1 = creator1.createProductA(); AbstractProductA a2 = creator2.createProductA(); AbstractProductB b1 = creator1.createProductB(); AbstractProductB b2 = creator2.createProductB(); // 业务逻辑从这里开始。。。。 } }
优点
缺点
定义
通用源码
/** * 产品类-实现模板方法模式 * * @author duogui.zq * @date 2019/2/21 */ public class Product { public void doSomething() { // 独立业务逻辑 } } /** * 抽象建造者-规范产品的组建 * * @author duogui.zq * @date 2019/2/21 */ public abstract class Builder { /** * 设置产品的不同部分,已获得不同的产品 */ public abstract void setPart(); /** * 建造产品 * * @return */ public abstract Product buildProduct(); } /** * 建造者 有多少个产品就有多少个建造者,这些产品类具有相同的接口或者抽象类 * * @author duogui.zq * @date 2019/2/21 */ public class ConcreteProduct extends Builder { private Product product = new Product(); @Override public void setPart() { } @Override public Product buildProduct() { return product; } } /** * 导演类 * * @author duogui.zq * @date 2019/2/21 */ public class Director { private Builder builder = new ConcreteProduct(); public Product getProduct() { builder.setPart(); /** * 设置不同的零件,产生不同的产品 */ return builder.buildProduct(); } }
定义
通用源码:
/** * 原型模式 * * @author emma_zhang * @date 2019/2/26 */ public class PrototyprClass implements Cloneable { @Override public PrototyprClass clone() { PrototyprClass prototyprClass = null; try { // prototyprClass = (PrototyprClass) super.clone(); }catch (CloneNotSupportedException e) { // 异常处理 } return prototyprClass; } }
使用场景
注意事项
深拷贝和浅拷贝
深拷贝的实例
/** * 深拷贝 * * @author emma_zhang * @date 2019/2/26 */ public class DeepClone implements Cloneable { private ArrayList<String> list = new ArrayList<>(); @Override public DeepClone clone() { DeepClone deepClone = null; try { deepClone = (DeepClone)super.clone(); deepClone.list = (ArrayList<String>)this.list.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } return deepClone; } }
原文:https://www.cnblogs.com/Gabby/p/10500073.html