简体   繁体   中英

Design Pattern For Creating Objects and Child Objects

I wonder if there is any kind of design pattern that make my code more concrete.

I guess a Factory Method Pattern can help me but not sure.

Below the code, the Shape creation Method needs other creation methods to create child elements (ex: Extrusion -> Loop -> Vertices). Inside Shape creation method, a programmer should customize created child element to clarify what shape the method will make. Below is just a my situation don't have to get deep into my situation. Anyone can help me, any suggestions will be glad.

thank you.

here is my suedo code flow written in C#. Sorry for the lack of details but better to understand faster.


public class SomethingClass
    {

        //Some codes...

        //create Circle
        public void CreateCircle(string SomethingPathName)
        {
            var element = CreateExtrusion(SomethingPathName);

            //some codes goes like below
            element.foofoo = bar;

            element = CreateLoop(element);

            foreach (var foo in bar)
            {
                element = CreateVertices(element);
            }
        }

        //create Rectangle
        public void CreateRectangle(string SomethingPathName)
        {
            var element = CreateExtrusion(SomethingPathName);

            //some codes..

            element = CreateLoop(element);

            //some codes..

            foreach (var foo in bar)
            {
                element = CreateVertices(element);
            }
        }

        //create something other shape
        public void CreatePyramid(string SomethingPathName)
        {
            var element = CreateExtrusion(SomethingPathName);

            //some codes..

            element = CreateLoop(element);

            //some codes..

            foreach (var foo in bar)
            {
                element = CreateVertices(element);
            }
        }

        // so one...

        //Some codes...
    }

below is my more specific real codes. I dont want you to get pain from this but if might be needed.

private void CreateFoundation(FoundationType foundationType, FoundationColumnName heightColumnName, DbElement objectiveElement, DataSet dsConverterData, DataTable dtConverterData, DataRow item_height, string extrusionName, string s3d_note, Guid PDMS_GROUP_ID)
{
    if (foundationType == FoundationType.FOOTING
      || foundationType == FoundationType.SCREEDTHK
      || foundationType == FoundationType.LEANCONCRETE
      || foundationType == FoundationType.CRUSHEDSTONES)
    {
        #region Footing, ScreedThk, LeanConcrete, CrushedStones                
        objectiveElement = this.CreateExtrusion(foundationType
            , objectiveElement
            , this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
            - GetSubBase_Z_HeightForCalculation(item_height, heightColumnName)
            , this.StringToDouble(item_height[heightColumnName.ToString()].ToString())
            , extrusionName
            , PDMS_GROUP_ID
            , s3d_note
            , dsConverterData.Tables[TableName.CONVERTER_FOUNDATIONS_DATA.ToString()].Rows[0][FoundationColumnName.NOTE_DIM.ToString()].ToString());

        //NXTRUSION 생성
        this.CreateHole(foundationType, objectiveElement, dsConverterData, extrusionName, PDMS_GROUP_ID, s3d_note);

        //create loop
        objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());

        //create vertices                      
        foreach (DataRow drConverterData in dtConverterData.Rows)
        {
            this.CreateVertex(
                objectiveElement
                , Guid.NewGuid().ToString()
                , StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
                , StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
                , this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d
                - GetSubBase_Z_HeightForCalculation(item_height, heightColumnName));                             
        }
        #endregion
    }
    else if (foundationType == FoundationType.PEDESTAL)
    {
        #region PEDESTAL                             
        //Gouping 구분 : PED_ID
        var groupBy_PED_ID = dtConverterData.AsEnumerable().GroupBy(row => row["PED_ID"]);
        string fdn_name_no = extrusionName;

        //목적지 엘리먼트 리셋
        DbElement temp_dest_equip = objectiveElement;
        foreach (var group_PED_ID in groupBy_PED_ID)
        {
            string ped_name = dsConverterData.Tables[TableName.CONVERTER_PEDESTAL_DATA.ToString()]
            .AsEnumerable()
            .Where(row0 => row0["PED_ID"].ToString() == group_PED_ID.AsEnumerable().FirstOrDefault()["PED_ID"].ToString())
            .Select(row => row["PED_NAME"].ToString()).FirstOrDefault().ToString();
            ped_name = Regex.Replace(ped_name, @"\s+", "");              

            objectiveElement = this.CreateExtrusion(
                foundationType
                , objectiveElement
                , this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
                , this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["PEDESTAL_HEIGHT"]).FirstOrDefault().ToString())
                , "(Pedestal)" + ped_name
                , PDMS_GROUP_ID
                , group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString()
                , group_PED_ID.AsEnumerable().Select(row => row["NOTE_DIM"]).FirstOrDefault().ToString());

            DbElement temp_pedestal = objectiveElement;

            this.CreateHole(foundationType
                , objectiveElement
                , dsConverterData
                , ped_name
                , PDMS_GROUP_ID
                , group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());

            objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());

            foreach (DataRow drConverterData in group_PED_ID)
            {
                this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
                    , this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
            }

            #region grout
            //목적지 엘리먼트 리셋
            objectiveElement = temp_dest_equip;
            objectiveElement = this.CreateExtrusion(
                FoundationType.GROUT
                , objectiveElement
              , this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
              + this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["PEDESTAL_HEIGHT"]).FirstOrDefault().ToString())
              , this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["GROUT_THK"]).FirstOrDefault().ToString())
              , "(Grout)" + ped_name
              , PDMS_GROUP_ID
              , group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());

            this.CreateHole(FoundationType.GROUT
                , objectiveElement
                , dsConverterData
                , ped_name
                , PDMS_GROUP_ID
                , group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());

            objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());

            foreach (DataRow drConverterData in group_PED_ID)
            {
                this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
                    , this.StringToDouble(drConverterData["GROUT_XPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["GROUT_YPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["GROUT_ZPOINT"].ToString()) * 1000d);

            }

            //목적지 엘리먼트 리셋
            objectiveElement = temp_dest_equip;
            #endregion                   
        }
        #endregion
    }
    else if (foundationType == FoundationType.PILE)
    {
        #region PILE           
        var groupBy_PILE_ID = dtConverterData.AsEnumerable().GroupBy(row => row["PILE_ID"]);

        //목적지 엘리먼트 리셋
        DbElement temp_dest_equip = objectiveElement;
        foreach (var group_PILE_ID in groupBy_PILE_ID)
        {
            DataRow drPile = group_PILE_ID.ToList().FirstOrDefault();
            string pile_note = $"{s3d_note}◆PI◆{drPile["PILE_SHAPE"]}◆{drPile["PILE_DIAMETER"]}◆{drPile["PILE_PREFIX"]}◆{drPile["PILE_NO"]}";
            string pile_noteItem = $"{s3d_note}◆PI◆{drPile["PILE_SHAPE"]}◆{drPile["PILE_DIAMETER"]}◆{drPile["PILE_PREFIX"]}◆{drPile["PILE_ID"]}";

            objectiveElement = this.CreateExtrusion(foundationType
                , objectiveElement
                , this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
                , this.StringToDouble(item_height[heightColumnName.ToString()].ToString())
                , extrusionName
                , PDMS_GROUP_ID
                , pile_note
                , ""
                , pile_noteItem);

            objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());

            foreach (DataRow drConverterData in group_PILE_ID)
            {
                this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
                    , this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
                    , this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
            }
            //목적지 엘리먼트 리셋
            objectiveElement = temp_dest_equip;
        }
        #endregion
    }
    else if (foundationType == FoundationType.TIEGIRDER)
    {
        #region TieGirder                
        objectiveElement = this.CreateExtrusion(
            foundationType
            , objectiveElement
            , this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
            , this.StringToDouble(dtConverterData.Rows[0]["TIEGIRDER_HEIGHT"].ToString())
            , extrusionName
            , PDMS_GROUP_ID
            , s3d_note
            , dsConverterData.Tables[TableName.CONVERTER_TIEGIRDER_DATA.ToString()].Rows[0][FoundationColumnName.NOTE_DIM.ToString()].ToString());

        objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());

        foreach (DataRow drConverterData in dtConverterData.Rows)
        {
            this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
                , this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
                , this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
                , this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
        }
        #endregion
    }
}

In your case, factory or abstract factory pattern.

There are the below design pattern for creation of object.

  1. Factory Method Pattern
  2. Abstract Factory Pattern
  3. Singleton Pattern
  4. Prototype Pattern
  5. Builder Pattern

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM