2011年12月7日

工厂模式用于工程单设计

设计方法:

在印刷厂的订单业务中会有以下情况:
一张订单会对应不同的内容的工程单,比如因卡片的,因喷画的,工程单的内容会有不同。
所以在设计工程单数据结构,以及显示和打印工程单的流程上面要使用工厂模式,做到在宏观上是一致处理的,在具体部分要不同类型的工程单可以单独处理。

数据结构方面:
  • 先要有一个父类,包含所有工程单的共同属性,比如工程单号等,尤其要有“工程单类型”,以便可以区分具体子类型。
  • 再从父类 派生不同类别的子类型。
执行方面:
  • 先定义一个接口,定义有有所有类别工程单必须的通用操作。
  • 从结构派生具体的子类。(是子 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();
        }
    }
}

没有评论:

发表评论