“
定义一个如下所示的CNumber类,并以其为基类派生出素数类CPrimeNumber,完全平方数类CCompleteSquareNumber和回文数类CPalindromeNumber。
class CNumber
{
protected:
char *p_type; // points to the text stating type of the number
public:
CNumber(char *p_number_type);
void print() { }
void printYes() { cout < < "It is a " < < p_type < < endl; }
void printNo() { cout < < "It is not a " < < p_type < < endl; }
virtual ~CNumber() { delete [] p_type; }
};
class CPrimeNumber : public CNumber
{
protected:
long n;
public:
CPrimeNumber(long n_val);
void print();
~CPrimeNumber() { }
};
class CCompleteSquareNumber : public CNumber
{
protected:
long n;
public:
CCompleteSquareNumber(long n_val);
void print();
~CCompleteSquareNumber() { }
};
class CPalindromeNumber : public CNumber
{
protected:
long n;
public:
CPalindromeNumber(long n_val)
void print();
~CPalindromeNumber() { }
};
void CPalindromeNumber::print()
{
long n1, sum=0;
int t;
n1 = n*n;
while (n1 != 0)
{
t = n1%10;
sum = sum*10 + t;
n1 = n1/10;
}
if (sum == n*n)
printYes();
else
printNo();
}
为了能实现如下例图所示的输出结果,应该怎样编写各个类其余各成员函数,并完成主函数的实现。
Enter a number <0 to exit>:13
Enter the type of number you want to check:
1.Prime number
2.Complete aquare number
3.Palindrome number
1
It is a Prime number
Enter a number <0 to exit>:16
Enter the type of number you want to check:
1.Prime number
2.Complete aquare number
3.Palindrome number
2
It is a Complete aquare number
Enter a number <0 to exit>:11
Enter the type of number you want to check:
1.Prime number
2.Complete aquare number
3.Palindrome number
3
It is a Palindrome number
Enter a number <0 to exit>:0
Press any key to continue
”
= = = = = = = = = = = = = = = = = = = = = = = = = = = = =
上文为网友的提问,其中“aquare”疑为“Square”之笔误。
这位朋友给出的部分实现代码,很是值得商榷,比如在类Cnumber中:
1. char *p_type;根本没有必要;
2. 下面3个函数如果都需要的话,将其设为虚函数更为恰当。
void print() { }
void printYes() { cout < < "It is a " < < p_type < < endl; }
void printNo() { cout < < "It is not a " < < p_type < < endl; }
还有,根据一般的规则,如果在类的定义出实现相关函数,最好使用如下的方式:
inline void printYes() { cout < < "It is a " < < p_type < < endl; }
…等等。
这个问题的实现完全可以不用所谓的设计模式,在下面的代码中,纯粹是为了顺便说明Factory Method这个设计模式的用法而引入了Factory Method模式,在这里,使用设计模式会增加很多代码。但这并不是说,设计模式不重要,事实上,设计模式是非常重要的。
代码如下:
// 抽象基类CNnumber
#include <math.h>
#include <iostream>
using namespace std;
class CNumber
{
public:
CNumber();
virtual void print() = 0; // 纯虚函数
virtual ~CNumber();
};
// 基类CNnumber的实现
CNumber::CNumber()
{
}
CNumber::~CNumber()
{
}
// 派生类CPrimeNumber
class CPrimeNumber : public CNumber
{
private:
long n;
public:
CPrimeNumber();
CPrimeNumber(long n);
void print();
virtual ~CPrimeNumber();
};
// 派生类CPrimeNumber的实现
CPrimeNumber::CPrimeNumber()
{
}
CPrimeNumber::CPrimeNumber(long n)
{
this->n = n;
}
void CPrimeNumber::print() // 重写基类的print,在此判断n是否为素数
{
int i;
int k;
k = sqrt((double)n);
for(i = 2; i <= k; i++)
{
if(n%i == 0) break;
}
if(i > k)
{
cout << n << " is a prime number" << endl;
}
else
{
cout << n << " isn't a prime number" << endl;
}
return;
}
CPrimeNumber::~CPrimeNumber()
{
}
// 派生类CCompleteSquareNumber
class CCompleteSquareNumber : public CNumber
{
private:
long n;
public:
CCompleteSquareNumber();
CCompleteSquareNumber(long n);
void print();
virtual ~CCompleteSquareNumber();
};
// 派生类CCompleteSquareNumber的实现
CCompleteSquareNumber::CCompleteSquareNumber()
{
}
CCompleteSquareNumber::CCompleteSquareNumber(long n)
{
this->n = n;
}
void CCompleteSquareNumber::print() // 重写基类的print,在此判断n是否为完全平方数
{
int k = sqrt((double)n);
if(n == k * k)
{
cout << n << " is a complete square number." << endl;
}
else
{
cout << n << " isn't a complete square number." << endl;
}
return;
}
CCompleteSquareNumber::~CCompleteSquareNumber()
{
}
// 派生类CPalindromeNumber
class CPalindromeNumber : public CNumber
{
protected:
long n;
public:
CPalindromeNumber();
CPalindromeNumber(long n);
void print();
virtual ~CPalindromeNumber();
};
// 派生类CPalindromeNumber的实现
CPalindromeNumber::CPalindromeNumber()
{
}
CPalindromeNumber::CPalindromeNumber(long n)
{
this->n = n;
}
void CPalindromeNumber::print() // 重写基类的print,在此判断n是否为回文数
{
int k;
int length;
char str[11];
itoa(n, str, 10);
length = strlen(str);
k = length / 2;
for(int i = 0; i < k; i++)
{
if(str[i] == str[length - i - 1])
{
continue;
}
else
{
cout << n << " isn't a palindrome number." << endl;
return;
}
}
cout << n << " is a palindrome number." << endl;
return;
}
CPalindromeNumber::~CPalindromeNumber()
{
}
// 抽象工厂类NumberFactory
class CNumberFactory
{
public:
CNumberFactory();
virtual ~CNumberFactory();
virtual CNumber* create(long number) = 0; // 这就是所谓的Factory Metho,即工厂方法
};
CNumberFactory::CNumberFactory()
{
}
CNumberFactory::~CNumberFactory()
{
}
// 具体工厂类CPrimeNumberFactory
class CPrimeNumberFactory : public CNumberFactory
{
protected:
CNumber* cnum;
public:
inline CPrimeNumberFactory()
{
cnum = NULL;
}
CNumber* create(long number); // 这就是所谓的Factory Metho,即工厂方法
virtual inline ~CPrimeNumberFactory()
{
if(cnum != NULL)
{
delete cnum;
cnum = NULL;
}
}
};
CNumber* CPrimeNumberFactory::create(long number)
{
cnum = new CPrimeNumber(number);
return cnum;
}
// 具体工厂类CPalindromeNumberFactory
class CCompleteSquareNumberFactory : public CNumberFactory
{
protected:
CNumber* cnum;
public:
inline CCompleteSquareNumberFactory()
{
cnum = NULL;
}
CNumber* create(long number); // 这就是所谓的Factory Metho,即工厂方法
virtual inline ~CCompleteSquareNumberFactory()
{
if(cnum != NULL)
{
delete cnum;
cnum = NULL;
}
}
};
CNumber* CCompleteSquareNumberFactory::create(long number)
{
cnum = new CCompleteSquareNumber(number);
return cnum;
}
// 具体工厂类CPalindromeNumberFactory
class CPalindromeNumberFactory : public CNumberFactory
{
protected:
CNumber* cnum;
public:
inline CPalindromeNumberFactory()
{
cnum = NULL;
}
CNumber* create(long number); // 这就是所谓的Factory Metho,即工厂方法
virtual inline ~CPalindromeNumberFactory()
{
if(cnum != NULL)
{
delete cnum;
cnum = NULL;
}
}
};
CNumber* CPalindromeNumberFactory::create(long number)
{
cnum = new CPalindromeNumber(number);
return cnum;
}
int main(void)
{
int number = 0;
int numbertype = 0;
CNumber* cnum = NULL;
CNumberFactory* cf = NULL;
while(true)
{
//system("cls");
cout << "Enter a number <0 to exit>:"; //<< endl;
cin >> number;
if(number == 0)
{
return 0;
}
cout << "Select the type of number you want to check:" << endl;
cout << "1.Prime number" << endl;
cout << "2.Complete square number" << endl;
cout << "3.Palindrome number" << endl;
cin >> numbertype;
if(numbertype < 1 || numbertype > 3)
{
cout << "Please select the right action." << endl;
}
switch(numbertype)
{
case 1:
cf = new CPrimeNumberFactory();
break;
case 2:
cf = new CCompleteSquareNumberFactory();
break;
case 3:
cf = new CPalindromeNumberFactory();
break;
default:
//system("pause");
break;
}
cnum = cf->create(number);
cnum->print();
delete cf;
cf = NULL;
//system("pause");
}
return 0;
}
各类之间的关系见如下UML类图:
分享到:
相关推荐
设计模式之Factory
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
c++设计模式之factory设计模式
AbstractFactory设计模式源码
设计模式-Singleton与Factory
对设计模式—Abstract Factory模式的认识
设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计...
Factory Method设计模式C#中的实现例子
创建型模式(Creational Pattern) 是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建型模式描述了怎样构造和封装这些动态的决定...
Factory.rar 设计模式
在前一节,我们介绍了Strategy模式,并使用此模式实现了一个根据角色的职业来分配技能的范例(实际也就是动态地为类分配方法)。作为一款奇幻RPG,有了职业,我们还应当可以为角色选择种族,比如说:人类(Human)、精灵...
七、 一个实际应用Adapter模式的例子 85 八、 关于Adapter模式的讨论 87 C#设计模式(11)-Composite Pattern 88 一、 合成(Composite)模式 88 二、 合成模式概述 88 三、 安全式的合成模式的结构 90 四、 安全式...
通俗易懂的设计模式(MVC,Factory) 通俗易懂的设计模式(MVC,Factory) 希望对你有所帮助
C++设计模式课件8_Factory Method_工厂方法.pdf
样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂 后,我们可能将无法维护子类的创建),最终我们在程序的扩展和维护成本上的开销将变得...
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
设计模式 t02FactoryMethod
设计模式 t01SimpleFactory
设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...
JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)