Java_23种设计模式(二)----- 创建型模式

来源:互联网 发布:网络综合布线设计图 编辑:程序博客网 时间:2024/06/05 11:42
/* * 创建型模式 * 1、 工厂方法模式: 简单工厂方法; 多个工厂方法; 静态工厂方法 * 2、 抽象工厂模式 * 3、 单例模式: 饿汉式模式和懒汉式模式 --- 通过创建对象的先后顺序来判断 先创建的叫饿汉;通过方法创建的叫懒汉 * 4、 建造者模式 * 5、 原型模式 */public class CreateModel {    // 1. 工厂方法模式    Sender s = new CommSenderFactory().producer("sms"); // 简单工厂    s.send();    Sender s1 = new MultiSenderFactory().smsProduer(); // 多个工厂方法模式;    s1.send();    Sender s2 = StaticSenderFatory.mailProduer(); // 静态工厂方法模式    s2.send();    // 2. 抽象工厂模式    Sender s3 = new MailSenderFactoryImpl().producer();    s3.send();    // 3. 单例模式    SingleModel s = SingleModel.getInstance();    MultiSingleModel s1 = MultiSingleModel.getInstance();    MultiSingleModel2 s2 = MultiSingleModel2.getInstance();    InnerSingleModel s3 = InnerSingleModel.getInstance();    // 4. 建造者模式    new Builder().producerMailSender(10);    // 5. 原型模式}/* * 原型模式 ------ 类似于克隆 分为浅克隆和深克隆 */ class Prototype implements Cloneable {     public Object clone() throws CloneNotSupportedException {        Prototype proto = (Prototype)super.clone();        return proto;     } } /*  * 建造者模式  ---- 创建多个复合对象  * 工厂模式 关注的是创建单个产品  * 建造者模式 关注创建符合对象, 有多个部分  */class Builer {    List<Sender> list = new ArrayList<Sender>();    public void produceMailSender ( int count ) {        for ( int i=0; i<count; i++ ) {            list.add(new MailSender());        }    }    public void produceSmsSender ( int count ) {        for ( int i=0; i<count; i++ ) {            list.add(new SmsSender());        }    }}/* * 饿汉式单例模式  在类初始化时,已经自行实例化,并且以后不再改变,所以天生是线程安全的 */class HungerSingleModel {    private HungerSingleModel() {}    private static final HungerSingleModel single = new HungerSingleModel();    public static HungerSingleModel getInstance() {        return single;    }}/* * 内部类单例模式 ---- 通过内部类的机制,保证当一个类被加载时,这个类的加载过程是线程互斥的 * ------缺点;如果在构造函数抛出异常, 实例将永远得不到创建,也会出错 *  也叫做懒汉式单例  在第一次调用的时候,实例化自己 */class InnerSingleModel {    private InnerSingleModel () {}    private static class SingletonFactory {        private static final InnerSingleModel single = new InnerSingleModel();    }    public static InnerSingleModel getInstance() {        return SingletonFactory.single;    }}/* * 多线程单例耗时少模式 --- 同样适合多线程,不过存在异常风险 * 也叫做懒汉式单例 在第一次调用的时候,实例化自己 */class MultiSingleModel2 {    private MultiSingleModel2 () {}    public static MultiSingleModel2 single;    public static MultiSingleModel2 getInstance () {        if ( single == null ) {            synchronized (single ) {                if ( single == null ) {                    return single = new MultiSingleModel2(); // 此处由于jvm的加载机制,可能会出现问题                }            }        }        return single;    }}/* * 多线程单例模式 --- 适合多线程, 性能低下 * 也叫做懒汉式单例 在第一次调用的时候,实例化自己 */class MultiSingleModel {    private MultiSingleModel () {}    public static MultiSingleModel single ;    public synchronized static MultiSingleModel getInstance() {        if ( single == null ) {            single = new MultiSingleModel();        }        return single;    }}/* * 普通单例模式  ---- 不适合多线程 *  也叫做懒汉式单例 在第一次调用的时候,实例化自己 */class SingleModel {    private SingleModel () {}    public static SingleModel single;    public static SingleModel getInstance () {        if ( single == null ) {            single = new SingleModel() ;        }        return single;    }}/* * 抽象工厂模式 */class MailSenderFactory implements ISenderFactory {    public Sender producer () {        return new MailSender();    }} class SmsSenderFactory implements ISenderFactory {    public Sender producer () {        return new SmsSender();    }} interface ISenderFactory {    Sender producer();}/* * 静态工厂方法 */class StaticSenderFatory {    public static Sender mailProduer () {        return new MailSender();    }    public static Sender smsProduer () {        return new SmsSender();    }}/* * 多个工厂方法 */class MultiSenderFactory {    public Sender mailProduer () {        return new MailSender();    }    public Sender smsProduer () {        return new SmsSender();    }}/* * 普通工厂方法 */class CommSenderFactory {    public Sender producer ( String type ) {        if ( "mail".equals(type) ) {            return new MailSender();        } else if ( "sms".equals(type) ) {            return new SmsSender();        } else { return null; }    }}class SmsSender implements Sender {    public void send () {        System.out.println("SmsSender -> send");    }}class MailSender implements Sender {    public void send () {        System.out.println("MailSender -> send");    }}interface Sender {    void send();}