|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。计划
明天我往市场,要决意是买生果等产物,仍是选择种生果的产物。详细怎样操纵本人选择。离开市场,我发明次要有一些生果:苹果(Apple),葡萄(Grape)和鸭梨(Pear)。究竟买甚么好呢?我一阵思考。俗语说:“饭后一只烟,胜过活仙人。饭后吃苹果,西施见我躲。”为了妻子的大度,我决意买苹果。
上面入手下手Factory形式研讨,固然是用我下面举的例子来讲明。
SimpleFactory形式
专门界说一个类来卖力创立别的类的实例,被创立的实例一般都具有配合的父类。
FactoryMethod形式
将对象的创立交由父类中界说的一个尺度办法来完成,而不是其机关函数,事实应当创立何种对象由详细的子类卖力决意。
AbstractFactory形式
供应一个配合的接口来创立互相联系关系的多个对象。
1、SimpleFactory形式:
1、在这里,我们先界说生果(Fruit)接口:
publicinterfaceFruit{
voidplant();//生果是被栽培的
voidenableEat();//生果能吃
}
2、苹果(Apple)是对生果(Fruit)接口的完成:
publicclassAppleimplementsFruit{
publicvoidplant(){
System.out.println("种苹果!");
}
publicvoidenableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对生果(Fruit)接口的完成:
publicclassGrapeimplementsFruit{
publicvoidplant(){
System.out.println("种葡萄!");
}
publicvoidenableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对生果(Fruit)接口的完成:
publicclassPearimplementsFruit{
publicvoidplant(){
System.out.println("种鸭梨!");
}
publicvoidenableEat(){
System.out.println("鸭梨好吃!");
}
}
5、界说买生果(BuyFruit)这一历程类:
publicclassBuyFruit{
/**
复杂工场办法
*/
publicstaticFruitbuyFruit(Stringwhich){
if(which.equalsIgnoreCase("apple")){//假如是苹果,则前往苹果实例
returnnewApple();
}
elseif(which.equalsIgnoreCase("pear")){//假如是鸭梨,则前往鸭梨实例
returnnewStrawberry();
}
elseif(which.equalsIgnoreCase("grape")){//假如是葡萄,则前往葡萄实例
returnnewGrape();
}
else{
returnnull;
}
}
}
6、编写测试类:
publicclassFruitTest{
publicstaticvoidmain(Stringargs[]){
BuyFruitbuy=newBuyFruit();//入手下手买生果这个历程
buy.buyFruit("apple").enableEat();//挪用苹果的enableEat()办法
}
}
7、申明:
A:我要购置苹果,只需向工场脚色(BuyFruit)哀求便可。而工场脚色在接到哀求后,会自行判别创立和供应哪个产物。
B:可是关于工场脚色(BuyFruit)来讲,增添新的产物(好比说增添草莓)就是一个疾苦的历程。工场脚色必需晓得每种产物,怎样创立它们,和什么时候向客户端供应它们。换言之,回收新的产物意味着修正这个工场。
C:因而SimpleFactory形式的开放性对照差。
有甚么举措能够办理这个成绩吗?那就必要FactoryMethod形式来为我们服务了。
2、FactoryMethod形式:
1、一样,我们先界说生果(Fruit)接口:
publicinterfaceFruit{
voidplant();//生果是被栽培的
voidenableEat();//生果能吃
}
2、苹果(Apple)是对生果(Fruit)接口的完成:
publicclassAppleimplementsFruit{
publicvoidplant(){
System.out.println("种苹果!");
}
publicvoidenableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对生果(Fruit)接口的完成:
publicclassGrapeimplementsFruit{
publicvoidplant(){
System.out.println("种葡萄!");
}
publicvoidenableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对生果(Fruit)接口的完成:
publicclassPearimplementsFruit{
publicvoidplant(){
System.out.println("种鸭梨!");
}
publicvoidenableEat(){
System.out.println("鸭梨好吃!");
}
}
5、在这里我们将买生果(BuyFruit)界说为接口类:
publicinterfaceBuyFruit{
/**
工场办法
*/
publicFruitbuyFruit();//界说买生果这一历程
}
6、买苹果是(BuyApple)对买生果(BuyFruit)这个接口的完成
publicclassBuyAppleimplementsBuyFruit{
publicFruitbuyFruit(){
returnnewApple();//前往苹果实例
}
}
7、买鸭梨是(BuyPear)对买生果(BuyFruit)这个接口的完成
publicclassBuyPearimplementsBuyFruit{
publicFruitBuyPear(){
returnnewPear();//前往鸭梨实例
}
}
8、买葡萄是(BuyGrape)对买生果(BuyFruit)这个接口的完成
publicclassBuyGrapeimplementsBuyFruit{
publicFruitBuyGrape(){
returnnewGrape();//前往葡萄实例
}
}
9、编写测试类:
publicclassFruitTest{
publicstaticvoidmain(Stringargs[]){
BuyApplebuy=newBuyApple();//入手下手买生果这个历程
buy.buyFruit().enableEat();//挪用苹果的enableEat()办法
}
}
10、申明:
A:工场办法形式和复杂工场形式在布局上的分歧是很分明的。工场办法形式的中心是一个笼统工场类,而复杂工场形式把中心放在一个详细类上。工场办法形式能够同意良多详细工场类从笼统工场类中将创立举动承继上去,从而能够成为多个复杂工场形式的综合,进而推行了复杂工场形式。
B:工场办法形式退步后能够变得很像复杂工场形式。假想假如十分断定一个体系只必要一个详细工场类,那末就无妨把笼统工场类兼并到详细的工场类中往。因为归正只要一个详细工场类,以是无妨将工场办法改成为静态办法,这时候候就失掉了复杂工场形式。
C:假如必要到场一个新的生果,那末只必要到场一个新的生果类和它所对应的工场类。没有需要修正客户端,也没有需要修正笼统工场脚色大概其他已有的详细工场脚色。关于增添新的生果类而言,这个体系完整撑持“开-闭”准绳。
D:对FactoryMethod形式而言,它只是针对一品种别(如本例中的生果类Fruit),但假如我们还想买肉,那就不可了,这是就必需要AbstractFactoryMethod形式协助了。
3、AbstractFactory形式
1、一样,我们先界说生果(Fruit)接口:
publicinterfaceFruit{
voidplant();//生果是被栽培的
voidenableEat();//生果能吃
}
2、苹果(Apple)是对生果(Fruit)接口的完成:
publicclassAppleimplementsFruit{
publicvoidplant(){
System.out.println("种苹果!");
}
publicvoidenableEat(){
System.out.println("苹果好吃!");
}
}
3、葡萄(Grape)是对生果(Fruit)接口的完成:
publicclassGrapeimplementsFruit{
publicvoidplant(){
System.out.println("种葡萄!");
}
publicvoidenableEat(){
System.out.println("葡萄好吃!");
}
}
4、鸭梨(Pear)是对生果(Fruit)接口的完成:
publicclassPearimplementsFruit{
publicvoidplant(){
System.out.println("种鸭梨!");
}
publicvoidenableEat(){
System.out.println("鸭梨好吃!");
}
}
5、界说肉(Meat)接口:
publicinterfaceMeat{
voidfeed();//肉是豢养的
voidenableEat();//肉能吃
}
6、猪肉(BigMeat)是对肉(Meat)接口的完成:
publicclassBigMeatimplementsMeat{
publicvoidfeed(){
System.out.println("养猪!");
}
publicvoidenableEat(){
System.out.println("猪肉好吃!");
}
}
7、牛肉(CowMeat)是对肉(Meat)接口的完成:
publicclassCowMeatimplementsMeat{
publicvoidfeed(){
System.out.println("养牛!");
}
publicvoidenableEat(){
System.out.println("牛肉好吃!");
}
}
8、我们能够界说买货人(Buyer)接口:
publicinterfaceBuyer{
/**
买生果工场办法
*/
publicFruitbuyFruit(FruitwhichFruit);
/**
买肉的工场办法
*/
publicMeatbuyMeat(MeatwhichMeat);
}
9、我(MyBuyer)是对买货人(Buyer)接口的完成:
publicclassMyBuyerimplementsBuyer{
/**
买生果工场办法
*/
publicFruitbuyFruit(FruitwhichFruit){
returnwhichFruit;
}
/**
买肉的工场办法
*/
publicMeatbuyMeat(MeatwhichMeat){
returnwhichMeat;
}
}
10、编写测试类:
publicclassMyBuyerAbstractTest{
publicstaticvoidmain(Stringargs[]){
Fruitapple=newApple();//苹果实例
Meatbig=newBigMeat();//猪肉实例
MyBuyermy=newMyBuyer();//我是买者的实例
my.buyFruit(apple).enableEat();//我买苹果
my.buyMeat(big).enableEat();//我买猪肉
}
}
11、申明:
A:笼统工场形式能够向客户端供应一个接口,使得客户端在不用指定产物的详细范例的情形下,创立多个产物族中的产物对象。这就是笼统工场形式的意图。
B:笼统工场形式是一切形状的工场形式中最为笼统和最具一样平常性的一种形状。
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试) |
|