您的位置:首页 > 其它

设计模式第十一、十二堂课

2016-04-06 16:35 197 查看
1.simple factory(静态工厂)

1)由一个工厂类决定创建出哪一种产品类的实例

2)问题解决

A.不同客户端需要相同类型的产品对象

B.保证产品对象初始化的一致性

3)解决

A. 客户端需要一个产品时,不直接创建新对象,而是通过向工厂类发送创建新对象请求,并提供需要的产品的类型

B. 工厂类实例化一个新的具体类型的产品并返回给客户端

C. 客户端可以以抽象产品的方式利用产品,不需要知道具体的实现

4)缺点

层次多,结构复杂,当要增加新的产品类,需要修改工厂类代码,违反开闭原则

 


<span style="color:#ff0000;">interface</span> Document {
public void viewDocument();
public boolean saveDocument();
}
public class PdfDocument implements Document{
public void viewDocument(){
System.out.println("view pdf");
}
public boolean saveDocument(){
//保存文档代码
//……

System.out.println("save pdf");
return true;
}
}

public class DocDocument implements Document{
public void viewDocument(){
System.out.println("view doc");
}
public boolean saveDocument(){
//保存文档代码
//……

System.out.println("save doc");
return true;
}
}

public class DocumentFactory {
public <span style="color:#cc0000;">static</span> Document createDocument(DocumentTpye key){
Document document = null;
if(key == DocumentTpye.pdf)
document = new PdfDocument();
else if(key == DocumentTpye.doc)
document = new DocDocument();
else{
return null;
}
return document;
}
}

public class DocumentViewer {
public enum DocumentTpye{doc,pdf};
private Document document;
private DocumentTpye key;
public void viewDocument(){
document.viewDocument();
}
}

public class Client {
public static void main(String []args){
Document document;
document = DocumentFactory.createDocument(DocumentTpye.pdf);
document.saveDocument();
document.viewDocument();

document = DocumentFactory.createDocument(DocumentTpye.doc);
document.saveDocument();
document.viewDocument();
}
}

输出:

save pdf
view pdf
save doc
view doc

2. factory method(工厂方法)

1)工厂方法定义了一个接口用于创建对象,但创建的对象类型由子类在运行时决定

2)问题解决

A.类不能预见创建的对象的类型

B.类的子类是特定类型的对象

3)解决

A. 抽象工厂定义工厂方法用于返回一个产品对象,该方法一般命名为createXXX(product)

B. 具体工厂实现抽象工厂创建产品的方法

 


 public abstract class DocumentCreater {
public abstract Document createDocument();
public void exportDocumnet(){
Document document = createDocument();
System.out.println("export " +document.getClass());
}
}
public class PdfDocumentCreater extends DocumentCreater {

@Override
public Document createDocument() {
System.out.println("create pdf");
return new PdfDocument();
}

}
public class DocDocumentCreater extends DocumentCreater{

@Override
public Document createDocument() {
System.out.println("create doc");
return new DocDocument();
}

}

public class Client {
public static void main(String []args){
DocumentCreater creater;
creater = new PdfDocumentCreater();
creater.exportDocumnet();

creater = new DocDocumentCreater();
creater.exportDocumnet();

}
}


输出:

create pdf
export class FactoryMethod.PdfDocument
create doc
export class FactoryMethod.DocDocument

3. abstractfactory(抽象工厂)

1)抽象工厂为一系列相关对象或相互依赖的对象创建一个接口

2)问题解决

A.系统不依赖产品类实例如何被创建、组合和表达
a336

B.系统拥有多个产品族,而系统只消费其中的某一族的产品

C.属于同一个产品族的产品必须一起使用

D.系统提供一个产品类的库,所有的产品以同样的接口出现,从而客户端不依赖于实现

3)解决

利用继承关系代替条件分支的行为

4)缺点

不太容易扩展新的产品

 


public abstract class Document {
public abstract void viewDocument();
public abstract boolean saveDocument();
}
public class DocDocument extends Document{

@Override
public void viewDocument() {
System.out.println("view doc");
}

@Override
public boolean saveDocument() {
System.out.println("view doc");
return true;
}

}

public class PdfDocument extends Document{

@Override
public void viewDocument() {
System.out.println("view pdf");
}

@Override
public boolean saveDocument() {
System.out.println("save pdf");
return true;
}

}

public abstract class Formatter {
public abstract void setFooterFormat();
public abstract void setHeaderFormat();
}

public class DocFormatter extends Formatter{

@Override
public void setFooterFormat() {
System.out.println("set doc footer");
}

@Override
public void setHeaderFormat() {
System.out.println("set doc header");
}

}

public class PdfFormatter extends Formatter{

@Override
public void setFooterFormat() {
System.out.println("set pdf footer");
}

@Override
public void setHeaderFormat() {
System.out.println("set pdf header");
}
}

public abstract class DocumentFactory {
public abstract Document createDocument();
public abstract Formatter createFormatter();
}

public class DocDocumentFactory extends DocumentFactory{

@Override
public Document createDocument() {
return new DocDocument();
}

@Override
public Formatter createFormatter() {
return new DocFormatter();
}

}

public class PdfDocumentFactory extends DocumentFactory{
@Override
public Document createDocument() {
return new PdfDocument();
}

@Override
public Formatter createFormatter() {
return new PdfFormatter();
}
}

public class Client {
public static void main(String []args){
DocumentFactory factory;
Document document;
Formatter formatter;

factory = new PdfDocumentFactory();
document = factory.createDocument();
document.viewDocument();
document.saveDocument();
formatter = factory.createFormatter();
formatter.setFooterFormat();
formatter.setHeaderFormat();
System.out.println("----------------");
factory = new DocDocumentFactory();
document = factory.createDocument();
document.viewDocument();
document.saveDocument();
formatter = factory.createFormatter();
formatter.setFooterFormat();
formatter.setHeaderFormat();

}
}


输出:

view pdf
save pdf
set pdf footer
set pdf header
----------------
view doc
view doc
set doc footer
set doc header

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: