请各位高手帮帮忙啊!!1 C++综合编程与简单设计模式的运用

1. 学习设计模式中创建型模式中的Factory模式和Singleton模式,总结对这两种模式的理解和认识。(参见附录1和附录2)
2. 完成具有以下功能的简单模型系统:系统中有一个唯一(Singleton)的水果生产工厂,能生产成品水果产品,如苹果(Apple)、梨子(Pear)、香蕉(Banana)、桃子(Peach)等等,生产工厂能根据用户的选择或要求(用简单文字选择界面实现)生产指定的水果并提供给客户。
附录1: Factory模式
在面向对象系统设计中经常可以遇到以下的两类问题:
为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。这里带来两个问题:
1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了),2)程序的扩展性和维护变得越来越困难。
2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。这里的意思为:假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。在A中我们没有办法直接使用类似于new ×××的语句,因为根本就不知道×××是什么。
以上两个问题也就引出了Factory模式的两个最重要的功能:
附录2: Singleton模式
Singleton模式解决问题十分常见,怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过Singleton模式来实现了,可能这也正是很多公司在招聘开发人员时候经常考察Singleton模式的缘故吧。1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。

#包括
包括
包括
定义MAXLEN 100
类型定义整型元素;
的typedef
{
元素数据[MAXLEN];
诠释listlen;
} seqlist;
无效initial_list(seqlist * L)
{L - > listlen = 0;}

的诠释list_length(seqlist L)
{L.listlen;}

的无效get_element(seqlist L,I,元素* X)
{如果( L.listlen)cout <<“请超出范围”;
其他* X = L.data [1];
} BR />
list_locate(seqlist L,元素X)
{

为(i = 0; <L.listlen,我+ +) />(L.data [I] == x)的回归(i +1);
回报(0);
}

无效list_insert(seqlist * L,元素X,I)
{
诠释J;
(L-> listlen == MAXLEN)法院<<“溢出”;
否则,如果( L-> listlen +1)cout <<“请位置误差”;
其他{(J = L-> listlen-1,J> = -1; J - )
? - >数据[J +1] = L->数据[J];
L->数据[I-1] = X;
L-> listlen + +;
} BR />
}

无效list_delete(seqlist * L,I)
{
诠释J;
(L-> listlen <= 0)cout <<“请下溢错误;
(I> L-> listlen | |我<= 0)法院<”删除位置不对“;

其他{( J = I,J listlen-1,J + +)
L->数据[J-1] = L->数据[J]。
L-> listlen - ;
}
}

无效排序(seqlist * L)
{
INT I,J;
元素温度;
(i = 1;我 listlen-1;我+ +)
为(J = 1; listlen-I; J + +)
(L - >数据[J-1]> L->数据[J])
{
TEMP = L->数据[J-1];
L->数据[J-1 ] = L->数据[J];
L->数据[J] =温度;
}
}
无效插入(seqlist * L,元素X) /> {
INT I = L-> listlen-1;
(> = MAXLEN 1)中cout <<“请溢出”;
其他{(> = 0 && L->数据[I]> X)
L->数据[i +1] = L->数据[ - ]
L->数据[i +1] = x; BR /> L-> listlen + +;
}

}

的无效list_cout(seqlist L)
{
我;
(i = 0; <L.listlen,我+ +)
法院<<环境运输及工务局局长(4)<< L.data [I];
法院< endl; BR />}
()
{
seqlist L1;元素E;
诠释,I,J;
(;)
{
法院<<“请选择您的操作”<< endl;
法院<<“选择”初始化“<< endl;
法院<<”选择2,创建一个序列表“< <endl;
法院<<“选择插入的元素”<< endl;
法院<<“请选择4删除元素”<< endl;
cout <<“请选择”查找元素“ “<< endl;
法院<<”6个串行输出元素“<< endl;
法院<;”排序“<< endl;
cout <<”请选择退出“<< endl;
CIN >>
如果出口(== 0)(0);
其他开关(A)
{
情况下, 1:initial_list(L1);
2:initial_list(与L1);法院<> J;
法院<<“ “”?<<“请输入元素”;
为(i = 1; > E list_insert(L1,E,I);} BR /> list_cout(L1);突破;
情况下,7排序(L1); list_cout(L1); cout <> E,插入(& L1,E); list_cout(L1);突破;

}
}

}

帮助你做一个计划,你都没有!程序调试没有问题
希望你满意!
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-16
用户名:wang104gang
电子邮件:保密
注册时间:2006年9月11日15时45分58秒
最后登录:2006-09-11 15点45分58秒> BR />问的问题,也改变小样儿的马甲
第2个回答  2012-12-11
class Fruit //抽象水果
{
public:
virtual void EatFruit()=0;
};
class Apple:public Fruit
{
public:
void EatFruit(){cout<<"Apple"<<endl;}
};
class Pear:public Fruit
{
public:
void EatFruit(){cout<<"Pear"<<endl;}
};
class Banana:public Fruit
{
public:
void EatFruit(){cout<<"Banana"<<endl}
};
class Peach:public Fruit
{
public:
void EatFruit(){cout<<"Peach"<<endl}
};

class FruitFactory //工厂
{
public:
Fruit *CreateFruit(int param)
{
switch(param)
{
case 1:
return new Apple();
case 2:
return new Pear();
case 3:
return new Banana();
case 4:
return new Peach();
}
}
};

class SingletonFactory //单件工厂
{
private:
static FruitFactory *Instance;
public:
SingletonFactory()
{
if(Instance==NULL)Instance =new FruitFactory();
}
Fruit *GetFruit(int param){return Instance->CreateFruit(param);}
};

以上是最简单的,其他的你可以自己改,工厂可以变成抽象工厂,构造析构自己填。本回答被网友采纳
相似回答