执行方法主体
static void Main(string[] args)
{
//创建实例
//准备ProductFactory类的实例
ProductFactory productFactory = new ProductFactory();
//准备WrapFactory类的实例
WrapFactory wrapFactory = new WrapFactory();
//创建Func委托
//定义为func1,用来委托ProductFactory类的MakePizza方法,
Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
//定义为func2,用来委托ProductFactory类的MakeToyCar方法,
Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);
//进行包装,将上面定义的func1委托作为参数传进去
//WrapProduct这个方法的返回值类型为Box类型,所以我们使用Box变量进行接收返回值
//虽然调用的是同一个方法,但是因为传进去的委托不同(被委托的方法不同),所以返回结果也不同
//func1委托的方法是披萨,所以返回披萨
Box box1 = wrapFactory.WrapProduct(func1);
//func2委托的方法是玩具车,所以返回玩具车
Box box2 = wrapFactory.WrapProduct(func2);
//输出,包装.产品.名称
Console.WriteLine(box1.Product.Name);
Console.WriteLine(box2.Product.Name);
}
创建产品模型
/// <summary>
/// 产品类
/// </summary>
class Product
{
/// <summary>
/// 产品的名称
/// </summary>
public string Name { get; set; }
}
创建包装模型
/// <summary>
/// 包装类
/// </summary>
class Box
{
/// <summary>
/// 需要包装的产品
/// </summary>
public Product Product { get; set; }
}
创建一个包装工厂类
/// <summary>
/// 创建一个包装工厂
/// </summary>
class WrapFactory
{
/// <summary>
/// 进行包装产品的方法
/// </summary>
/// <param name="getProduct">主体main里面的自定义委托:func1,func1被委托调用productFactory类的MakePizza方法</param>
/// <returns></returns>
public Box WrapProduct(Func<Product> getProduct)
{
//创建一个新的包装
Box box = new Box();
//产品类型接收,调用被委托的方法
Product product = getProduct.Invoke();
//将被委托的方法的返回值放到包装里面
box.Product = product;
//返回包装
return box;
}
}
创建一个产品工厂类
/// <summary>
/// 创建一个产品工厂类
/// </summary>
class ProductFactory
{
/// <summary>
/// 方法一
/// </summary>
/// <returns>返回:披萨</returns>
public Product MakePizza()
{
//实例化Product类
Product product = new Product();
//赋值该类中的Name属性为披萨
product.Name = "披萨";
//返回Product类型数据,需要使用Product类型进行接收
return product;
}
/// <summary>
/// 方法二
/// </summary>
/// <returns>返回:玩具车</returns>
public Product MakeToyCar()
{
//实例化Product类
Product product = new Product();
//赋值该类中的Name属性为玩具车
product.Name = "玩具车";
//返回Product类型数据,需要使用Product类型进行接收
return product;
}
}