设计模式之对象的创建

本文是个人对java与模式这本书的个人总结,因为很多模式都已经了解,不做解释,只做补充。

 

对象的创建可能会用到以下几种模式

1)简单工厂模式

2)工厂方法模式

3)抽象工厂模式

4)单例模式

5)多例模式

6)建造模式

7)原始模型模式(复制)

 

一、简单工厂模式

举例:植物园创建水果。

使用方法:通过水果名,返回水果实例。

注意点:

1)创建实例的方法都是静态的,不能继承。

2)如果想返回一个新的水果,就需要改写创建方法,会违背开-闭原则。正因为如此,引用了工厂方法模式。

 

二、工厂方法模式

举例:女娲用阳绳创建阿土仔,萨隆巴斯,龟太郎。 用阴绳创建孙小美,钱夫人。

工厂方法模式的核心:创造的是抽象工厂,而非一个具体的工厂。

注意点:

1)工厂方法一定程度上支持了开闭原则,如果需要创建一个新对象,可增加一个工厂类。

2)缺点是工厂类增多,是多态性的丧失与退化。试想,如果每一个对象都有一个工厂类,感觉这些工厂类反而没有存在的必要了。选择这些工厂类,跟直接选择对象再new出来有什么区别呢?

 

三、抽象工厂方法

目的为了创建产品族。

举例:为不同的操作系统创建控件组。这些控件组包括Edit, static, button,list, combox等等。

我们可以不同的工厂:WindowsCtlFactory, UnixCtlFactory, LinuxCtlFactory等等。让这些工厂实现同一个接口(createEdit, createStatic, createList, createCombox...)

注意:如果增加产品,该模式会违背开闭原则,每个工厂类的创建方法都要修改。

如果增加产品族,只需要增加一个工厂类即可,支持开闭原则。(对扩展支持,对修改封闭)

 

四、单例模式

注意:单例模式不要滥用。例如将全局变量放到一个类中,再使其单例,并不提倡。不应该将这些乱七八糟的东西放到一起,而应该放到自己相关的类中,否则容易产生依赖和耦合。Context类的信息也应该是相关的(例如windows里的DC),不能什么都往里放。

 

五、多例模式

注意:多例模式中实例的数量是有上限的。

 

六、建造模式

例子:一封完整的邮件应该有发件人地址,送信人地址,主题,内容。

目的:导演者只需要知道一个完整对象应该创建哪些part和创建的先后顺序,而这些part是怎么实现的,则由具体builder来实现。

适用场合:

1)创建part内容非常复杂,不同的产品有不同的创建part方法。

2)part创建有先后次序。

 

角色:导演者、抽象Builder,具体builder,产品。可在导演着的构造函数中完成产品的构建。

示例代码:

 

class Director
{
    protected Mail mail;
    public Director(BuilderMail builder)
    {
        builder.buildFrom();
        builder.buildTo();
        builder.buildTopic();
        builder.buildMemo();
        mail = bulider.getMail();
    }
}

interface BuilderMail
{
    public void buildFrom();
    public void buildTo();
    public void buildTopic();
    public void buildMemo();
    public Mail getMail();
}

class BuilderWelcomeMail implement Builder
{
    protected Mail mail = new Mail();
    public void buildFrom()
    {
        mail.from = "csdn@sina.com";
    }
    public void buildTo()
    {
        mail.to = "user1@sina.com";
    }
    public void buildTopic()
    {
        mail.topic = "welcome";
    }

    public void buildMemo()
    {
        mail.memo = "WelCome! WelCome! WelCome!"
    }

    public product getMail()
    {
        return mail;
    }
}

class BuilderGoodByeMail implement Builder
{
    protected Mail mail = new Mail();
    public void buildFrom()
    {
        mail.from = "msdn@sina.com";
    }
    public void buildTo()
    {
        mail.to = "user2@sina.com";
    }
    public void buildTopic()
    {
        mail.topic = "88";
    }

    public void buildMemo()
    {
        mail.memo = "goodbye, 88";
    }

    public product getMail()
    {
        return mail;
    }
}

注意该模式弱化

1)如果Builder只有一个,就不需要抽象Builder。

2)可以不需要导演者,即将builder接口改写为抽象类。将导演者的构造函数的内容移植到builder的构造函数中。

这样模式就发生了变化,转变为模板模式!!!

 

七、原始模式

即java的clone,cis的duplicate。

需要注意的是clone有两种:深复制和浅复制。

在java中浅复制很容易,只要将类的定义声明为implements Cloneable,并调用super.clone()来实现clone函数!

深复制也很容易,利用流。将object放入byte流中,再从流中读回来即可。

这同时也说明,类的串行化过程不是简单将引用对象的地址放到byte流中,而是将引用对象的全部数据信息都放到了流中!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值