設計模式(四)————工廠方法模式(Factory Pattern)與抽象工廠方法模式(Abstract Factory Pattern)

工廠方法模式

定義:定義一個創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類。

UML類圖:

C++實現:

#include<iostream>
using namespace std;

class Shape
{
public:
	virtual void Draw() = 0;
};
class Circle :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Circle!" << endl;
	}
};
class Sphere :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Sphere!" << endl;
	}
};
class Cube :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Cube!" << endl;
	}
};

class ShapeFactory
{
public:
	Shape* getShape(string shapeType)
	{
		if (shapeType == "")
		{
			return nullptr;
		}
		if (shapeType == "Circle")
		{
			return new Circle();
		}
		if (shapeType == "Sphere")
		{
			return new Sphere();
		}
		if (shapeType == "Cube")
		{
			return new Cube();
		}
		return nullptr;
	}
	~ShapeFactory() {};
};
int main()
{
	ShapeFactory* shapeFactory = new ShapeFactory();

	Shape* shape1 = shapeFactory->getShape("Circle");
	shape1->Draw();

	Shape* shape2 = shapeFactory->getShape("Sphere");
	shape2->Draw();

	Shape* shape3 = shapeFactory->getShape("Cube");
	shape3->Draw();
	return 0;
}

C#實現:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using static System.Console;

namespace ConsoleApp1
{

    public interface Shape
    {
        void Draw();
    }
    public class Circle:Shape
    {
        public void Draw()
        {
            WriteLine("Draw Circle!");
        }
    }
    public class Sphere : Shape
    {
        public void Draw()
        {
            WriteLine("Draw Sphere!");
        }
    }
    public class Cube : Shape
    {
        public void Draw()
        {
            WriteLine("Draw Cube!");
        }
    }
    public class ShapeFactory
    {
       public Shape getShape(String shapeType)
        {
            if (shapeType == null)
            {
                return null;
            }
            if(shapeType.Equals("Circle"))
            {
                return new Circle();
            }
            if(shapeType.Equals("Sphere"))
            {
                return new Sphere();
            }
            if(shapeType.Equals("Cube"))
            {
                return new Cube();
            }
            return null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ShapeFactory shapeFactory = new ShapeFactory();

            Shape shape1 = shapeFactory.getShape("Circle");
            shape1.Draw();

            Shape shape2 = shapeFactory.getShape("Sphere");
            shape2.Draw();

            Shape shape3 = shapeFactory.getShape("Cube");
            shape3.Draw();
        }
    }
}

抽象工廠方模式

定義:爲創建一組相關或者相互依賴的對象提供一個接口,而無需指定他們的具體類。(又稱爲工廠的工廠)

UML類圖:

C++實現:

#include<iostream>
using namespace std;

class Shape
{
public:
	virtual void Draw() = 0;
};
class Color
{
public:
	virtual void Draw() = 0;
};
class AbstractFactory
{
	virtual Shape* getShape(string shapeType) { return nullptr; }
	virtual Color* getColor(string colorType) { return nullptr; }
};

class Circle :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Circle!" << endl;
	}
};
class Sphere :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Sphere!" << endl;
	}
};
class Cube :public Shape
{
public:
	// 通過 Shape 繼承
	virtual void Draw() override
	{
		cout << "Draw Cube!" << endl;
	}
};

class ShapeFactory:public AbstractFactory
{
public:
	virtual Shape* getShape(string shapeType) override
	{
		if (shapeType == "")
		{
			return nullptr;
		}
		if (shapeType == "Circle")
		{
			return new Circle();
		}
		if (shapeType == "Sphere")
		{
			return new Sphere();
		}
		if (shapeType == "Cube")
		{
			return new Cube();
		}
		return nullptr;
	}
	~ShapeFactory() {};
};
class Red :public Color
{
public:
	virtual void Draw()
	{
		cout << "Fill Red!!!" << endl;
	}
};
class Green :public Color
{
public:
	virtual void Draw()
	{
		cout << "Fill Green!!!" << endl;
	}
};
class Blue :public Color
{
public:
	virtual void Draw()
	{
		cout << "Fill Blue!!!" << endl;
	}
};
class ColorFactory :public AbstractFactory
{
public:
	virtual Color* getColor(string colorType) override
	{
		if (colorType == "")
			return nullptr;
		if (colorType == "Red")
			return new Red();
		if (colorType == "Green")
			return new Green();
		if (colorType == "Blue")
			return new Blue();
		return nullptr;
	}
	~ColorFactory(){}
};
class FactoryProducer
{
public:
	static AbstractFactory* getFactory(string abstractType)
	{
		if (abstractType == "")
			return nullptr;
		if (abstractType == "SHAPE")
			return new ShapeFactory();
		if (abstractType == "COLOR")
			return new ColorFactory();
		return nullptr;
	}
	~FactoryProducer() {}
};
int main()
{
	FactoryProducer* factoryProducer = new FactoryProducer();

ShapeFactory* shapeFactory = dynamic_cast<ShapeFactory*>(factoryProducer->getFactory("SHAPE"));
	Shape* shape1 = shapeFactory->getShape("Circle");
	shape1->Draw();

ColorFactory* colorFactory = dynamic_cast<ColorFactory*>(factoryProducer->getFactory("COLOR"));
	Color* color1=colorFactory->getColor("Red");	color1->Draw();
	return 0;
}

C#實現:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using static System.Console;

namespace ConsoleApp1
{

    public interface Shape
    {
        void Draw();
    }
    public interface Color
    {
        void Draw();
    }
    public abstract class AbstractFactory
    {
        public abstract Shape getShape(String shapeType);
        public abstract Color getColor(String colorType);
    }

    public class Circle:Shape
    {
        public void Draw()
        {
            WriteLine("Draw Circle!");
        }
    }
    public class Sphere : Shape
    {
        public void Draw()
        {
            WriteLine("Draw Sphere!");
        }
    }
    public class Cube : Shape
    {
        public void Draw()
        {
            WriteLine("Draw Cube!");
        }
    }
    public class ShapeFactory:AbstractFactory
    {
        public override Shape getShape(String shapeType)
        {
            if (shapeType == null)
            {
                return null;
            }
            if(shapeType.Equals("Circle"))
            {
                return new Circle();
            }
            if(shapeType.Equals("Sphere"))
            {
                return new Sphere();
            }
            if(shapeType.Equals("Cube"))
            {
                return new Cube();
            }
            return null;
        }
        public override Color getColor(string colorType)
        {
            return null;
        }

    }

    public class Red : Color
    {
        public void Draw()
        {
            WriteLine("Fill Red!!!");
        }
    }
    public class Green : Color
    {
        public void Draw()
        {
            WriteLine("Fill Green!!!");
        }
    }
    public class Blue : Color
    {
        public void Draw()
        {
            WriteLine("Fill Blue!!!");
        }
    }
    class ColorFactory:AbstractFactory
    {
        public override Shape getShape(String shapeType)
        {
            return null;
        }
        public override Color getColor(String colorType)
        {
            if (colorType == null)
                return null;
            if(colorType.Equals("Red"))
            {
                return new Red();
            }
            if(colorType.Equals("Green"))
            {
                return new Green();
            }
            if(colorType.Equals("Blue"))
            {
                return new Blue();
            }
            return null;
        }
    }
    public class FactoryProducer
    {
        public static AbstractFactory getAbstractFactory(String abstractType)
        {
if (abstractType == "")
                return null;
            if(abstractType.Equals("SHAPE"))
            {
                return new ShapeFactory();
            }
            if(abstractType.Equals("COLOR"))
            {
                return new ColorFactory();
            }
            return null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AbstractFactory shapeFactory = FactoryProducer.getAbstractFactory("SHAPE");

            Shape shape1 = shapeFactory.getShape("Circle");
            shape1.Draw();

            AbstractFactory colorFactory = FactoryProducer.getAbstractFactory("COLOR");

            Color color1 = colorFactory.getColor("Red");
            color1.Draw();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章