前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

简单工厂模式(Simple Factory Pattern)

模式定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于创建型模式。在简单工厂模式中,可以根据传入静态方法不同的参数返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

UML 类图

  • Factory 工厂角色 负责实现创建所有实例的内部逻辑(一般为静态类包含静态方法)
  • Product 抽象产品角色 所有具体产品类的超类
  • ConcreteProduct 具体产品 需要创建的类

代码结构组成

	public class SampleFactoryApp
	{
	    public void Run()
		{
			Product p = Factory.CreateProduct("A");
			p.Display();
		}
	}
	public static class Factory
	{
		public static Product CreateProduct(string type)
		{
			Product product = null;
			if (type == "A")
			{
				product = new ConcreteProductA();
			}
			else if (type == "B")
			{
				product = new ConcreteProductB();
			}

			return product;
		}
	}
	public abstract class Product
	{
		public abstract void Display();
	}

	public class ConcreteProductA : Product
	{
		public override void Display()
		{
			Console.WriteLine("Concrete Product A");
		}
	}

	public class ConcreteProductB:Product
	{
		public override void Display()
		{
			Console.WriteLine("Concrete Product A");
		}
	}

情景案例

一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个按钮基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用的方法,把该参数传入方法即可返回一个相应的按钮对象。

public class SampleFactoryApp
	{
		public void Run()
		{
			Button btn = ButtonFactory.CreateButton("A");
			btn.Display();
		}
	}
	public static class ButtonFactory
	{
		public static Button CreateButton(string type)
		{
			Button button = null;
			if (type == "C")
			{
				button = new CircleButton();
			}
			else if (type == "R")
			{
				button = new RectangleButton();
			}

			return button;
		}
	}
	public abstract class Button
	{
		public abstract void Display();
	}

	public class CircleButton : Button
	{
		public override void Display()
		{
			Console.WriteLine("This is Circle Button");
		}
	}

	public class RectangleButton : Button
	{
		public override void Display()
		{
			Console.WriteLine("This is Rectangle Button");
		}
	}
posted @ 2018-01-23 18:30  LoveTomato  阅读(177)  评论(0编辑  收藏  举报