没有合适的资源?快使用搜索试试~ 我知道了~
二十三中社設計模式加實例二十三中社設計模式加實例二十三中社設計模式加實例
资源详情
资源评论
资源推荐
1、FACTORY—追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽
然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳
和肯德基就是生产鸡翅的 Factory
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者
无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向
客户端提供。
abstract class AProductRam {
public String getProduct() {
return this+" Product";
}
}
abstract class AProductCpu {
public String getProduct() {
return this+" Product";
}
}
/**
* 具体产品 MacRam,WinRam
*/
class CProductMacRam extends AProductRam {
public String toString() {
return "MacRam";
}
}
class CProductWinRam extends AProductRam {
public String toString() {
return "WinRam";
}
}
/**
* 具体产品 MacCpu,WinCpu
*/
class CProductMacCpu extends AProductCpu {
public String toString() {
return "MacCpu";
}
}
class CProductWinCpu extends AProductCpu {
public String toString() {
return "WinCpu";
}
}
/**
*生成一种新的产品系列时,接口改动的代码
*/
/*
class CProductNewRam extends AProductRam {
public String toString() {
return "NewRam";
}
}
class CProductNewCpu extends AProductCpu {
public String toString() {
return "NewCpu";
}
}
*/
/**
* 抽象工厂 AFactory
*/
interface AFactory {
public AProductRam CreateProductRam();
public AProductCpu CreateProductCpu();
}
/**
* 具体工厂 CFactoryMac
* 创建 Mac 产品系列
× MacRam MacCpu
*/
class CFactoryMac implements AFactory {
public AProductRam CreateProductRam() {
return new CProductMacRam();
}
public AProductCpu CreateProductCpu() {
return new CProductMacCpu();
}
}
/**
* 具体工厂 CFactoryWin
* 创建 Win 产品系列
× WinRam WinCpu
*/
class CFactoryWin implements AFactory {
public AProductRam CreateProductRam() {
return new CProductWinRam();
}
public AProductCpu CreateProductCpu() {
return new CProductWinCpu();
}
}
/**
* 要生成一种新的产品系列时,对客户要派发一个新的产品工厂
* 同时要派生出一种新的具体产品
* CFactoryNew
* NewMem,NewCpu
*/
/*
class CFactoryNew implements AFactory {
public AProductRam CreateProductRam() {
return new CProductNewRam();
}
public AProductCpu CreateProductCpu() {
return new CProductNewCpu();
}
}
*/
/**
* 客户端
* 1.使用 FactoryMac 创建 Mac 系列产品:ProductMacRam,ProductMacCpu
× 2.使用 FactoryWin 创建Win 系列产品:ProductWinRam,ProductWinCpu
* 3.只要知道 CFactoryMac,CFactoryWin(具体工厂)和
* AProductRam,AProductCpu(抽象产品)即可,至于具体产品的创建
* 细节客户不用关心
*/
class Factory {
private static void printProduct(String v) {
System.out.println(v);
}
public static void main(String[] args) {
AProductRam ProductMacRam=null,ProductWinRam=null;
AProductCpu ProductMacCpu=null,ProductWinCpu=null;
CFactoryMac FactoryMac=new CFactoryMac();
CFactoryWin FactoryWin=new CFactoryWin();
ProductMacRam=FactoryMac.CreateProductRam();
ProductMacCpu=FactoryMac.CreateProductCpu();
ProductWinRam=FactoryWin.CreateProductRam();
ProductWinCpu=FactoryWin.CreateProductCpu();
printProduct(ProductMacRam.getProduct());
printProduct(ProductMacCpu.getProduct());
printProduct(ProductWinRam.getProduct());
printProduct(ProductWinCpu.getProduct());
/**
*生成一种新的产品系列时,客户端改动的代码
*/
/*
AProductRam ProductNewRam=null;
AProductCpu ProductNewCpu=null;
CFactoryNew FactoryNew=new CFactoryNew();
ProductNewRam=FactoryNew.CreateProductRam();
ProductNewCpu=FactoryNew.CreateProductCpu();
printProduct(ProductNewRam.getProduct());
printProduct(ProductNewCpu.getProduct());
*/
}
}
2、BUILDER—MM 最爱听的就是“我爱你”这句话了,见到不同地方的 MM,要能够用她们的方
言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的
键,它就能够用相应的语言说出“我爱你”这句话了,国外的 MM 也可以轻松搞掂,这就是我的“我爱
你 ”builder。(这一定比美军在伊拉克用的翻译机好卖)
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的
内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。
建造模式可以强制实行一种分步骤进行的建造过程。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构
建它们.用户不知道内部的具体构建细节.Builder 模式是非常类似抽象工厂模式,细微的区别大概只有在反
复使用中才能体会到.
为何使用?是为了将构建复杂对象的过程和它的部件解耦.注意: 是解耦过程和部件.
因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机还有各种小零件等
等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),
Builder 模式就是为了将部件和组装过程分开.
如何使用?首先假设一个复杂对象是由多个部件组成的,Builder 模式是把复杂对象的创建和部件的
创建分别开来,分别用 Builder 类和 Director 类来表示.
首先,需要一个接口,它定义如何创建复杂对象的各个部件:
public interface Builder {
//创建部件 A 比如创建汽车车轮
void buildPartA();
//创建部件 B 比如创建汽车方向盘
void buildPartB();
//创建部件 C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的 Director 类中进行.
//从而实现了解耦过程和部件
Product getResult();
}
用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一个个部件(复杂对象
是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装成成品:
public class Director {
private Builder builder;
public Director( Builder builder ) {
this.builder = builder;
}
// 将部件 partA partB partC 最后组成复杂对象
//这里是将车轮 方向盘和发动机组装成汽车的过程
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
Builder 的具体实现 ConcreteBuilder:
通过具体完成接口 Builder 来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口:
public class ConcreteBuilder implements Builder {
Part partA, partB, partC;
public void buildPartA() {
//这里是具体如何构建 partA 的代码
};
public void buildPartB() {
//这里是具体如何构建 partB 的代码
};
public void buildPartC() {
//这里是具体如何构建 partB 的代码
};
public Product getResult() {
//返回最后组装成品结果
};
}
复杂对象:产品 Product:public interface Product { }
复杂对象的部件:public interface Part { }
我们看看如何调用 Builder 模式:
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );
director.construct();
Product product = builder.getResult();
Builder 模式的应用在 Java 实际使用中,我们经常用到"池"(Pool)的概念,当资源提供者无法提供足够
的资源,并且这些资源需要被很多用户反复共享时,就需要使用池."池"实际是一段内存,当池中有一些复杂的
资源的"断肢"(比如数据库的连接池,也许有时一个连接会中断),如果循环再利用这些"断肢",将提高内存使
用效率,提高池的性能.修改 Builder 模式中 Director 类使之能诊断"断肢"断在哪个部件上,再修复这个部件.
3、FACTORY METHOD—请MM 去麦当劳吃汉堡,不同的MM 有不同的口味,要每个都记住是
一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说“要一个汉堡”,具体
要什么样的汉堡呢,让 MM 直接跟服务员说就行了。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成
为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这
种细节。
// 产品 Plant 接口
public interface Plant { }
//具体产品 PlantA,PlantB
public class PlantA implements Plant {
public PlantA () {
System.out.println("create PlantA !");
}
public void doSomething() {
System.out.println(" PlantA do something ...");
}
}
public class PlantB implements Plant {
public PlantB () {
System.out.println("create PlantB !");
}
public void doSomething() {
System.out.println(" PlantB do something ...");
}
}
// 产品 Fruit 接口
public interface Fruit { }
//具体产品 FruitA,FruitB
public class FruitA implements Fruit {
public FruitA() {
System.out.println("create FruitA !");
}
public void doSomething() {
System.out.println(" FruitA do something ...");
}
}
public class FruitB implements Fruit {
public FruitB() {
System.out.println("create FruitB !");
}
public void doSomething() {
System.out.println(" FruitB do something ...");
}
}
// 抽象工厂方法
public interface AbstractFactory {
public Plant createPlant();
public Fruit createFruit() ;
}
剩余34页未读,继续阅读
Bruce54
- 粉丝: 27
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0