运行效果
代码
using System;
namespace 原型模式
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("原型模式");
Client client = new Client();
client.mian();
Console.ReadLine();
}
}
public interface ITank
{
void run();
ITank clone();
void setSpeed(int speed);
}
public class Tank : ITank
{
public Tank(int speed)
{
setSpeed(speed);
}
public int speed = 0;
public ITank clone()
{
return new Tank(speed);
}
public void run()
{
Console.WriteLine("速度:" + speed);
}
public void setSpeed(int speed)
{
this.speed = speed;
}
}
public class Client
{
public void mian()
{
const int num = 10;
const int baseSpeed = 50;
ITank tank = new Tank(50);
ITank[] tanks = new Tank[num];
// 克隆20辆坦克
for(int i = 0; i < num; i++)
{
tanks[i] = tank.clone();
}
// 生成20种不同的坦克
for (int i = 0; i < num; i++)
{
tanks[i].setSpeed(50+i);
}
// 运行20种不同的坦克
for (int i = 0; i < num; i++)
{
tanks[i].run();
}
}
}
}
简单优化
这里做了一个简单优化,既然对象的主要价值在于克隆,那么也就没有对外提供构造函数的必要。
所以这里,将构造函数私有化,然后对外提供一个单件对象。
using System;
namespace 原型模式
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("原型模式");
Client client = new Client();
client.mian();
Console.ReadLine();
}
}
public interface ITank
{
void run();
ITank clone();
void setSpeed(int speed);
}
public class Tank : ITank
{
/// <summary>
/// 这里做了一个简单优化,既然对象的主要价值在于克隆,那么也就没有对外提供构造函数的必要。
/// 所以这里,将构造函数私有化,然后对外提供一个单件对象。
/// </summary>
public static Tank tank = new Tank(50);
private Tank(int speed)
{
setSpeed(speed);
}
public int speed = 0;
public ITank clone()
{
return new Tank(speed);
}
public void run()
{
Console.WriteLine("速度:" + speed);
}
public void setSpeed(int speed)
{
this.speed = speed;
}
}
public class Client
{
public void mian()
{
const int num = 10;
const int baseSpeed = 50;
//ITank tank = new Tank(50);
ITank[] tanks = new Tank[num];
// 克隆20辆坦克
for(int i = 0; i < num; i++)
{
tanks[i] = Tank.tank.clone();
}
// 生成20种不同的坦克
for (int i = 0; i < num; i++)
{
tanks[i].setSpeed(50+i);
}
// 运行20种不同的坦克
for (int i = 0; i < num; i++)
{
tanks[i].run();
}
}
}
}