在印刷厂的订单业务中会有以下情况:
一张订单会对应不同的内容的工程单,比如因卡片的,因喷画的,工程单的内容会有不同。
所以在设计工程单数据结构,以及显示和打印工程单的流程上面要使用工厂模式,做到在宏观上是一致处理的,在具体部分要不同类型的工程单可以单独处理。
数据结构方面:
- 先要有一个父类,包含所有工程单的共同属性,比如工程单号等,尤其要有“工程单类型”,以便可以区分具体子类型。
- 再从父类 派生不同类别的子类型。
- 先定义一个接口,定义有有所有类别工程单必须的通用操作。
- 从结构派生具体的子类。(是子 Class,不是子Interface)
- 在子类中实现自己独有的相关操作。
- 传入进入工厂类,使用数据的父类。
- 出工厂类是Interface类型。
- 之后直接都使用接口的函数操作,与具体子类型无关。
相关思考:
也可以考虑用纯虚类实现。
以下是代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
#region 数据结构
public class PROC
{
public string strType = "";
}
public class PROC_CARD : PROC
{
public PROC_CARD ()
{
strType = "Card";
}
public string c1 ;
public string c2 ;
public string c3;
}
public class PROC_PAINT : PROC
{
public PROC_PAINT()
{
strType = "Paint";
}
public string p1 ;
public string p2 ;
}
#endregion
#region 方法
public interface IProce
{
void Create();
void Show();
}
public class Provider_Card : IProce
{
PROC_CARD stru = new PROC_CARD();
public Provider_Card(PROC o)
{
stru = o as PROC_CARD;
}
public void Create ()
{
stru.c1 = "c1";
stru.c2 = "c2";
stru.c3 = "c3";
}
public void Show ()
{
Console.WriteLine(stru.strType + " " + stru.c1 + " " + stru.c2 + " " + stru.c3);
}
}
public class Provider_Paint : IProce
{
PROC_PAINT stru = new PROC_PAINT();
public Provider_Paint ( PROC o )
{
stru = o as PROC_PAINT;
}
public void Create()
{
stru.p1 = "p1";
stru.p2 = "p2";
}
public void Show()
{
Console.WriteLine(stru.strType + " " + stru.p1 + " " + stru.p2);
}
}
#endregion
static public IProce Factory( PROC stru )
{
if (stru.strType == "Card")
{
Provider_Card p = new Provider_Card(stru);
return p;
}
else if (stru.strType == "Paint")
{
Provider_Paint p = new Provider_Paint(stru);
return p;
}
Console.WriteLine( "err factory!" );
return null;
}
static void Main(string[] args)
{
PROC_CARD stru = new PROC_CARD();
stru.c1 = "444";
stru.c2 = "555";
stru.c3 = "666";
//PROC_PAINT stru = new PROC_PAINT();
//stru.p1 = "111";
//stru.p2 = "999";
IProce I = Factory(stru as PROC);
if (I != null)
{
//I.Create();
I.Show();
}
//
Console.ReadKey();
}
}
}
没有评论:
发表评论