Avatar billede Droa Seniormester
29. juli 2016 - 22:17 Der er 5 kommentarer og
1 løsning

Factory Design med Polymorphism i produkt

Hej Eksperter.

Jeg prøver og implementere et Factory Design til og læse mit XDocument.

<root>
  <struktur1 attr="one" attr="two">Text</struktur1>
  <struktur2 attr="10">
      <items>
        <item>1</item>
      </items>
  <struktur2>
...
</root>

lad os sige jeg har sådan et dokument

så vil jeg selvfølgelig have 2 Classes

public class Struktur1 : Struktur
public class Struktur2 : Struktur


og derefter mit "Struktur Factory" til og lave dem ud fra mit XDocument som  laver et Build(XElement) af hver Child i XDocument.RootElement

problemet er bare jeg er nød til og lave Ctor på Struktur1 og Struktur2 for public, for at StrukturFactory kan lave dem, det ødelægger jo lidt ideen med et factory design, og jeg var nysgerrig om der var et godt design til denne type Factory der bruger Polymorphism?

på forhånd mange tak :)
Avatar billede arne_v Ekspert
30. juli 2016 - 01:54 #1
Alle klasser har en constructor. Hvorfor skulle det vaere et problem med factory pattern?
Avatar billede arne_v Ekspert
30. juli 2016 - 01:55 #2
Hvis du virkeligt ville lave det nemt, saa puttede du passendre attributter paa din XML og brugte XmlSerializer til at deserialisere med.
Avatar billede arne_v Ekspert
30. juli 2016 - 18:50 #3
Eksempel med XmlSerializer:


using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace E
{
    public class Struktur
    {
    }
    [XmlRoot(ElementName="struktur1")]
    public class Struktur1 : Struktur
    {
        [XmlAttribute(AttributeName="a1")]
        public string A1 { get; set; }
        [XmlAttribute(AttributeName="a2")]
        public string A2 { get; set; }
        [XmlText]
        public string Content { get; set; }
    }
    [XmlRoot(ElementName="struktur2")]
    public class Struktur2 : Struktur
    {
        [XmlArray(ElementName="items")]
        [XmlArrayItem(ElementName = "item")]
        public List<int> Items;   
    }
    [XmlRoot(ElementName="root")]
    public class Root
    {
        [XmlElement(Type = typeof(Struktur1), ElementName = "struktur1")]
        [XmlElement(Type = typeof(Struktur2), ElementName = "struktur2")]
        public List<Struktur> Data;
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            string xmlstr =
@"<root>
  <struktur1 a1='one' a2='two'>Text</struktur1>
  <struktur2 a='10'>
      <items>
        <item>1</item>
      </items>
  </struktur2>
</root>";
            Console.WriteLine(xmlstr);
            XmlSerializer ser = new XmlSerializer(typeof(Root), new Type[] { typeof(Struktur1), typeof(Struktur2) });
            //Root r = new Root() { Data = new List<Struktur> { new Struktur1() { A1 = "one", A2 = " two" , Content = "Text" }, new Struktur2() { Items = new List<int> { 1, 2, 3 } } } };
            //ser.Serialize(Console.Out, r);
            Root r = (Root)ser.Deserialize(new StringReader(xmlstr));
            foreach(Struktur s in r.Data)
            {
                Console.WriteLine(s.GetType().FullName);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
30. juli 2016 - 18:51 #4
Men hvis emnet er factory (og jeg har set et andet spoergsmaal omkring factory), saa kan det naturligvis ikke bruges.
Avatar billede Droa Seniormester
02. august 2016 - 12:26 #5
mange tak for svaret og eksemplet, jeg nåede ikke lige og svare, da jeg er taget på en tur til Milano :)

Jeg viste slet ikke man kunne det i C#, det reducere jo gevaldigt det arbejde man skal bruge på XML :)

mang tak
Avatar billede arne_v Ekspert
02. august 2016 - 14:53 #6
Det er super smart.

Eneste ulempe er at det godt nogen gange kan drille lidt at finde den helt rigtiige kombination af attributter til data klasserne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester