本文是个人对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流中,而是将引用对象的全部数据信息都放到了流中!!