设计模式第十一、十二堂课
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 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();
}
}
输出:
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();
}
输出:
view pdf
save pdf
set pdf footer
set pdf header
----------------
view doc
view doc
set doc footer
set doc header
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
相关文章推荐
- CSS中vh和vw单位设置宽高
- 简单工厂模式之php实现
- UVA401_Palindromes
- Qunee for HTML5 V2.5新版本发布
- Android分包MultiDex原理详解
- 收起虚拟键盘
- 第六周书面项目(3):程序的理解
- Java多线程学习
- 四则运算手机开发版
- maven profile实现多环境打包
- jsp入门(一个菜鸟的搬砖历程
- 不一样的命令行 – Windows PowerShell简介
- 内存管理
- 一个简单的JDBC程序
- 关于C语言的问卷调查
- Android 属性动画跟插值器估值器
- Shiro学习(3)授权
- 【OSI】--数据链路层
- 特征选择常用算法综述
- jdbcTemplate:包含占位符的SQL无法打印参数信息