# design-pattern **Repository Path**: MyFreeStyleWXH/design-pattern ## Basic Information - **Project Name**: design-pattern - **Description**: 设计模式相关代码 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # design-pattern #### 介绍 设计模式相关代码 #### 软件架构 ##### 1.工厂模式: 1. 简单工厂模式:对应simplefactory包 简单工厂模式是对创建不同类型对象的封装,通过传参判断要创建对象的类型或者调用工厂类提供的多个创建不同对象的方法,返回对应类型得对象. Calendar创建实例时用到了简单工厂模式 简单工厂模式又分为普通简单工厂模式(ordinarysimplefactory包)、多方法简单工厂模式(multimethodsimplefactory包)、静态简单工厂模式(staticmethodsimplefactory包) 1.1 普通简单工厂模式 通过传参判断要创建对象的类型 ``` /** * 根据类型生产对应得Sender * * @param type * @return */ public Sender produce(String type) { if (type == null) { return null; } else if ("email".equals(type)) { return new EmailSender(); } else if ("express".equals(type)) { return new ExpressSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { return null; } } ``` 1.2 多方法简单工厂模式 在普通简单工厂模式中,如果参数传递有问题,则不能创建出想要的对象,因此可以在程序中提供不同的方法用于创建不同类型的对象,以避免参数问题. ``` /** * 生产邮件发送 * @return */ public Sender produceEmail() { return new EmailSender(); } /** * 生产短信发送 * @return */ public Sender produceSms(){ return new SmsSender(); } /** * 生产快递发送 * @return */ public Sender produceExpress(){ return new ExpressSender(); } ``` 1.3 静态简单工厂模式 对于普通简单工厂模式及多方法简单工厂模式来说,要创建想要的对象,首先要先创建工厂对象.因此可以将方法改为静态方法,可以直接调用静态方法,创建想要的对象. ``` /** * 生产邮件发送 * @return */ public static Sender produceEmail() { return new EmailSender(); } /** * 生产短信发送 * @return */ public static Sender produceSms(){ return new SmsSender(); } /** * 生产快递发送 * @return */ public static Sender produceExpress(){ return new ExpressSender(); } ``` 2. 工厂方法模式:对应factory包 对于普通工厂模式来说,如果需要增加要生产的产品(对象)的类型,则需要去修改工厂类中的代码.扩展性不好 工厂方法模式就是首先定义一个抽象工厂,定义对象生产的接口.不同的对象提供对应得工厂实现类生产对应类型的对象. 如果需要增加产品的类型,直接增加一个对应类型的工厂类实现即可,原先的代码无需改动. ``` /** * sender抽象工厂 * * @author wangxinhua */ public interface SendFactory { Sender produce(); } /** * 邮件发送工厂类 * * @author wangxinhua */ public class EmailSenderFactory implements SendFactory { @Override public Sender produce() { return new EmailSender(); } } /** * 快递发送工厂类 * * @author wangxinhua */ public class ExpressSenderFactory implements SendFactory { @Override public Sender produce() { return new ExpressSender(); } } /** * 短信发送工厂类 * * @author wangxinhua */ public class SmsSenderFactory implements SendFactory { @Override public Sender produce() { return new SmsSender(); } } ``` 3. 抽象工厂模式:对应abstractfactory包 工厂方法模式或者简单工厂模式,都是只能去生产同一种类型(即实现了同一个接口)的产品.如代码中的Sender. 抽象工厂模式是在抽象工厂中可以定义多种类型(不同类型即指实现了不同接口)产品的生产方法 ``` /** * 抽象工厂类 * 为创建一组相关的或者相互依赖的对象提供接口 * 一个工厂可以生产多种类型的'产品' * * @author wangxinhua */ public interface Factory { /** * 生产电视 * @return */ Television produceTelevision(); /** * 生产冰箱 * @return */ Refrigerator produceRefrigerator(); } ``` ##### 单例模式: 对应singleton包 1. 分为懒汉式和饿汉式 懒汉式有线程安全问题,需要volatile+双重检测锁保证线程安全. 也可以使用静态内部类或者枚举方式实现单例模式 2. 单例模式在JDK应用: java.lang.Runtime就是经典的单例模式,通过饿汉式创建. 3. 使用场景 1. 需要频繁的创建和销毁对象 2. 创建对象时耗时过多或耗费资源过多,但又经常用的对象,比如:数据源,session工厂