软件设计原则与模式练习源代码.docx
- 文档编号:4070142
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:103
- 大小:279.53KB
软件设计原则与模式练习源代码.docx
《软件设计原则与模式练习源代码.docx》由会员分享,可在线阅读,更多相关《软件设计原则与模式练习源代码.docx(103页珍藏版)》请在冰豆网上搜索。
软件设计原则与模式练习源代码
2.1简单工厂模式练习:
简单工厂模式在农场系统中的实现
抽象产品角色(Product):
packagecom.simpleFactory.fruit;
publicinterfaceFruit{
/*****生长*****/
voidgrow();
/*****收获*****/
voidharvest();
/*****种植*****/
voidplant();
}
产品角色(ConcreteProduct)一:
packagecom.simpleFactory.fruit;
publicclassAppleimplementsFruit{
privateinttreeAge;
@Override
publicvoidgrow(){
log("苹果正在生长中,请耐心等待...");
}
@Override
publicvoidharvest(){
log("苹果已到收获季,请收获...");
}
@Override
publicvoidplant(){
log("苹果可以种植,请悉心照料...");
}
privatestaticvoidlog(Stringmsg){
System.out.println(msg);
}
publicintgetTreeAge(){
returntreeAge;
}
publicvoidsetTreeAge(inttreeAge){
this.treeAge=treeAge;
}
}
产品角色(ConcreteProduct)二:
packagecom.simpleFactory.fruit;
publicclassGrapeimplementsFruit{
booleanseedless;
@Override
publicvoidgrow(){
Display("葡萄正在生长中,请等待......");
}
@Override
publicvoidharvest(){
Display("葡萄已到收获季,请收获......");
}
@Override
publicvoidplant(){
Display("葡萄可以种植,请悉心照料......");
}
privatestaticvoidDisplay(Stringmsg){
System.out.println(msg);
}
publicbooleangetSeedless(){
returnseedless;
}
publicvoidsetSeedless(booleanseedless){
this.seedless=seedless;
}
}
产品角色(ConcreteProduct)三:
packagecom.simpleFactory.fruit;
publicclassStrawberryimplementsFruit{
@Override
publicvoidgrow(){
Display("草莓正在生长中,请等待......");
}
@Override
publicvoidharvest(){
Display("草莓已到收获季,请收获......");
}
@Override
publicvoidplant(){
Display("草莓可以种植,请悉心照料......");
}
privatestaticvoidDisplay(Stringmsg){
System.out.println(msg);
}
}
工厂角色(Creator):
packagecom.simpleFactory.fruit;
publicclassFruitGardener{
publicstaticFruitfactory(Stringfruit)throwsBadFruitException{
if(fruit.equalsIgnoreCase("apple"))
returnnewApple();
elseif(fruit.equalsIgnoreCase("strawberry"))
returnnewStrawberry();
elseif(fruit.equalsIgnoreCase("grape"))
returnnewGrape();
else
thrownewBadFruitException("Badfruitrequest");
}
publicstaticvoidfactory(Stringfruit,Stringfarmwork)throwsBadFruitException{
if(farmwork.equalsIgnoreCase("grow")){
FruitGardener.factory(fruit).grow();
}
elseif(farmwork.equalsIgnoreCase("harvest")){
FruitGardener.factory(fruit).harvest();
}
elseif(farmwork.equalsIgnoreCase("plant")){
FruitGardener.factory(fruit).plant();
}elseif(farmwork.equalsIgnoreCase("strawberry")){
FruitGardener.factory(fruit).plant();
}elseif(farmwork.equalsIgnoreCase("grape")){
FruitGardener.factory(fruit).plant();
}
else
thrownewBadFruitException("Badfruitrequest");
}
}
输入异常处理:
packagecom.simpleFactory.fruit;
publicclassBadFruitExceptionextendsException{
publicBadFruitException(Stringmsg){
super(msg);
}
}
客户端:
packagecom.simpleFactory.fruit;
importjava.util.Scanner;
publicclassClient{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
while(true){
Stringmsg1=null;
Stringmsg2=null;
Stringmsg3=null;
System.out.println("请输入水果和状态:
");
msg1=scanner.next();
msg2=scanner.next();
try{
FruitGardener.factory(msg1,msg2);
}catch(BadFruitExceptione){
System.out.println("很抱歉,您的输入有误,请检查。
");
}
System.out.println("是否继续?
(Y/N)");
msg3=scanner.next().substring(0);
if(msg3.equalsIgnoreCase("N"))
System.exit(0);
}
}
}
程序运行结果如下:
2.2工厂方法模式练习:
工厂方法模式在农场系统中的实现
抽象产品(Product)角色:
packagecom.factorymethod.farm;
publicinterfaceFruit
{
voidgrow();
voidharvest();
voidplant();
}
具体产品(ConcreteProduct)角色Apple:
packagecom.factorymethod.farm;
publicclassAppleimplementsFruit{
privateinttreeAge;
publicvoidgrow(){
System.out.println("Appleisgrowing...");
}
publicvoidharvest(){
System.out.println("Applehasbeenharvested.");
}
publicvoidplant(){
System.out.println("Applehasbeenplanted.");
}
publicintgetTreeAge(){
returntreeAge;
}
publicvoidsetTreeAge(inttreeAge){
this.treeAge=treeAge;
}
}
具体产品(ConcreteProduct)角色Grape:
packagecom.factorymethod.farm;
publicclassGrapeimplementsFruit{
publicvoidgrow(){
System.out.println("Grapeisgrowing...");
}
publicvoidharvest(){
System.out.println("Grapehasbeenharvested.");
}
publicvoidplant(){
System.out.println("Grapehasbeenplanted.");
}
publicbooleangetSeedless(){
returnseedless;
}
publicvoidsetSeedless(booleanseedless){
this.seedless=seedless;
}
privatebooleanseedless;
}
具体产品(ConcreteProduct)角色Strawberry:
packagecom.factorymethod.farm;
publicclassStrawberryimplementsFruit{
publicvoidgrow(){
System.out.println("Strawberryisgrowing...");
}
publicvoidharvest(){
System.out.println("Strawberryhasbeenharvested.");
}
publicvoidplant(){
System.out.println("Strawberryhasbeenplanted.");
}
}
抽象工厂(Creator)角色FruitGardener:
packagecom.factorymethod.farm;
publicinterfaceFruitGardener{
publicFruitfactory();
/**@linkdependency
*@labelCreates*/
/*#FruitlnkFruit;*/
}
具体工厂(ConcreteCreator)角色AppleGardener:
packagecom.factorymethod.farm;
publicclassAppleGardenerimplementsFruitGardener{
publicFruitfactory(){
returnnewApple();
}
}
具体工厂(ConcreteCreator)角色GrapeGardener:
packagecom.factorymethod.farm;
publicclassGrapeGardenerimplementsFruitGardener{
publicFruitfactory(){
returnnewGrape();
}
}
具体工厂(ConcreteCreator)角色StrawberryGardener:
packagecom.factorymethod.farm;
publicclassStrawberryGardenerimplementsFruitGardener{
publicFruitfactory(){
returnnewStrawberry();
}
}
客户端:
packagecom.factorymethod.farm;
importjava.util.Scanner;
publicclassClient{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
while(true){
Stringfruitname=null;
System.out.print("请输入你要水果:
");
Scannerin=newScanner(System.in);
Stringa=in.next();
Fruitfruit=null;
FruitGardenerfruitGardener;
if(a.equalsIgnoreCase("apple")){
fruitGardener=newAppleGardener();
fruit=fruitGardener.factory();
Appleapple=(Apple)fruit;
apple.setTreeAge(5);
System.out.println("苹果树的年龄为:
"+apple.getTreeAge()+"年");
}
elseif(a.equalsIgnoreCase("garpe")){
fruitGardener=newGrapeGardener();
fruit=fruitGardener.factory();
Grapegrape=(Grape)fruit;
grape.setSeedless(true);
System.out.println(grape.getSeedless()==true?
"葡萄无籽":
"葡萄有籽");
}
elseif(a.equalsIgnoreCase("strawberry")){
fruitGardener=newStrawberryGardener();
fruit=fruitGardener.factory();
}
fruit.grow();
fruit.harvest();
fruit.plant();
System.out.print("是否继续?
(Y/N)");
fruitname=scanner.next().substring(0);
if(fruitname.equalsIgnoreCase("N")){
System.out.println("程序退出,再见!
");
System.exit(0);
}
}
}
}
程序运行结果如下:
2.3抽象工厂模式:
“女娲造人”的实现
抽象产品(AbstractProduct)角色,由Human、黑色人种、白色人种、黄色人种组成:
Human
packagecom.abstractfactory.女娲造人;
publicinterfaceHuman{
//每个人种的皮肤都有相应的颜色
publicvoidgetColor();
//人类会说话
publicvoidtalk();
//人类性别
publicvoidsex();
}
黑色人种
packagecom.abstractfactory.女娲造人;
publicabstractclass黑色人种implementsHuman{
publicvoidgetColor(){
System.out.println("黑色人种的皮肤颜色是黑色的!
");
}
publicvoidtalk(){
System.out.println("黑人会说话,一般人听不懂。
");
}
}
白色人种
packagecom.abstractfactory.女娲造人;
publicabstractclass白色人种implementsHuman{
publicvoidgetColor(){
System.out.println("白色人种的皮肤颜色是白色的!
");
}
publicvoidtalk(){
System.out.println("白色人种会说话,一般都是但是单字节。
");
}
}
黄色人种
packagecom.abstractfactory.女娲造人;
publicabstractclass黄色人种implementsHuman{
publicvoidgetColor(){
System.out.println("黄色人种的皮肤颜色是黄色的!
");
}
publicvoidtalk(){
System.out.println("黄色人种会说话,一般说的都是双字节。
");
}
}
具体产品(ConcreteProduct)角色由男性黑色人种、男性白色人种、男性黄色人种、女性黑色人种、女性白色人种、女性黄色人种组成:
男性黑色人种
男性白色人种
男性黄色人种
女性黑色人种
packagecom.abstractfactory.女娲造人;
publicclass女性黑色人种extends黑色人种{
publicvoidsex(){
System.out.println("我是女性黑色人种!
");
}
}
女性白色人种
packagecom.abstractfactory.女娲造人;
publicclass女性白色人种extends白色人种{
publicvoidsex(){
System.out.println("我是女性白色人种!
");
}
}
女性黄色人种
packagecom.abstractfactory.女娲造人;
publicclass女性黄色人种extends黄色人种{
publicvoidsex(){
System.out.println("我是女性黄色人种!
");
}
}
抽象工厂(AbstractFactory)角色由AbstractHumanFactory组成:
packagecom.abstractfactory.女娲造人;
publicabstractclassAbstractHumanFactory{
/**
*通过定义泛型对createHuman的输入参数产生两层限制:
*1、须是Class类型;
*2、必须是Human的实现类;
*“?
”表示只要实现了人类接口的类都可以作为参数
*/
publicabstractHumancreateHuman(Class
extendsHuman>c);
}
具体工厂类(ConcreteFactory)角色由阴绳、阳绳组成:
阴绳
packagecom.abstractfactory.女娲造人;
publicclass阴绳extendsAbstractHumanFactory{
publicHumancreateHuman(Class
extendsHuman>c){
//定义一个生产的人种
Humanhuman=null;
try{
//产生一个人种
human=(Human)Class.forName(c.getName()).newInstance();
}catch(Exceptione){
System.out.println("人种生成错误!
");
}
returnhuman;
}
}
阳绳
packagecom.abstractfactory.女娲造人;
publicclass阳绳extendsAbstractHumanFactory{
publicHumancreateHuman(Class
extendsHuman>c){
//定义一个生产的人种
Humanhuman=null;
try{
//产生一个人种
human=(Human)Class.forName(c.getName()).newInstance();
}catch(Exceptione){
System.out.println("人种生成错误!
");
}
returnhuman;
}
}
女娲测试端程序如下:
packagecom.abstractfactory.女娲造人;
publicclass女娲娘娘{
publicstaticvoidmain(String[]args){
//声明阴绳
AbstractHumanFactoryyinsheng=new阴绳();
//女娲第一次造人,火候不足,缺陷产品
System.out.println("--造出的第一批人是白色人种--");
HumanwhiteHuman=yinsheng.createHuman(女性白色人种.class);
whiteHuman.getColor();
whiteHuman.talk();
whiteHuman.sex();
//女娲第二次造人,火候过足,又是次品,
System.out.println("\n--造出的第二批人是黑色人种--");
HumanblackHuman=yinsheng.createHuman(女性黑色人种.class);
blackHuman.getColor();
bl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 原则 模式 练习 源代码