zoukankan      html  css  js  c++  java
  • 简单工厂模式(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");
    		}
    	}
    
  • 相关阅读:
    电信生命周期说明
    find in linux 2 微信公众号
    GDB中应该知道的几个调试方法 2 微信公众号
    linux 下程序员专用搜索源码用来替代grep的软件ack(后来发现一个更快的: rg), 且有vim插件的 2 微信公众号
    linux下的 c 和 c++ 开发工具及linux内核开发工具 2 微信公众号
    linux下命令行发送邮件的软件:mutt 微信公众号
    腺样体肿大的综合治疗考虑 微信公众号
    打呼噜治疗方法 微信公众号
    vim 操作 2 微信公众号
    nginx之外的web 服务器caddy 微信公众号
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8337297.html
Copyright © 2011-2022 走看看