Abstract factory

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 506 fois - Téléchargée 18 fois

Contenu du snippet

Abstract Factory pattern est un motif Création. Patterns Création traité meilleure façon de créer un objet.
Abstract Factory est une Factory qui retourne un objet de plusieurs Factorys.
Dans cette example, l'interface Factory dispose de deux implémentations concrètes, ConcreteFactory1 et ConcreteFactory2. Le GetObject (), l'intérieur de ces classes concrètes Derived1 et retours Derived2 objets, respectivement.
Le client peut décider de la classe ConcreteFactory qui doit être utilisé pendant « Run Time ».

Source / Exemple :


using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    interface IBrickObjects
    {
        void Rotate();
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    interface  ISelect
    {
        IBrickObjects GetBrickObject();
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class ObjectH : IBrickObjects
    {
        public void Rotate()
        {
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class ObjectHFactory:ISelect 
    {
        public  IBrickObjects GetBrickObject()
        {
            return (new ObjectH()); 
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class Rectangle : IBrickObjects
    {
        public  void Rotate()
        {
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class RectangleFactory : ISelect 
    {
        public IBrickObjects GetBrickObject()
        {
            return (new Rectangle());
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class ReverseH : IBrickObjects 
    {
        public void Rotate()
        {
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class ReverseHFactory : ISelect 
    {
        public IBrickObjects GetBrickObject()
        {
            return (new ReverseH());
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class Square : IBrickObjects
    {
        public void Rotate()
        {
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class SquareFactory : ISelect 
    {
        public IBrickObjects GetBrickObject()
        {
            return (new Square());
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class Straightline : IBrickObjects
    {
        public void Rotate()
        {
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace BrickGame4AbsctractFactory
{
    class StraightlineFactory : ISelect 
    {
        public IBrickObjects GetBrickObject()
        {
            return (new Straightline());
        }
    }
}

Client Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BrickGame4AbsctractFactory
{
    public partial class Main : Form
    {
        ISelect m_ObjSelect;
        public Main()
        {
            InitializeComponent();
        }

        private IBrickObjects ActivateObject(string ObjectName)
        {
            switch (ObjectName)
            {
                case "Square":
                    m_ObjSelect = new SquareFactory();
                    break;
                case "Straightline":
                    m_ObjSelect = new StraightlineFactory();
                    break;
                case "Rectangle":
                    m_ObjSelect = new RectangleFactory ();
                    break;
                
            
            }
            return m_ObjSelect.GetBrickObject() ;

        }
        private void Main_Load(object sender, EventArgs e)
        {
	
            IBrickObjects l_objBrickObject = ActivateObject("Square"); 
            l_objBrickObject.Rotate();
 
        }
    }
}

Conclusion :


L'interface a IBrickObjects,la méthode qui doit être appliquée par tous les objets de la brique.
Les formes ISelect interface de l'interface de l'usine de tous les objets de Brick objet qui sera l'objet exact pour appeler la méthode GetObject.

A voir également

Ajouter un commentaire

Commentaires

sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
En fait, c'est intéressant quand c'est maitrisé... par exemple, on peut imaginer que tu développes toute la logique d'accés aux données de ton application (select one, select all, insert, delete, update)... ensuite tu définis dans une autre assembly les spécialisations pour chaque objet (ou table).
Ensuite, il ne te reste plus qu'à charger dynamiquement (Reflection) cette assembly et l'utiliser via la factory. Avantage, tu peux modifier l'implémentation sans toucher à l'application.

J'ai un article (et une source) en cours sur ce concept.
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,
Je ne vois pas du tout l'interêt de ton code. Le système que tu présente ici est efficacement remplacé par la reflexion (namespace System.Reflection) qui permet même de créer des objets dont les classes sont définies dans des librairies externes et non référencées dans le projet.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.