zoukankan      html  css  js  c++  java
  • 设计模式 简单工厂(simple factory pattern)转载

    所有的创建模式都涉及到创建对象示例方式。这一点很重要,因为程序不应该依赖于对象如何创建和如何安排 。当然,使用new运算符是C#创建一个对象实力最简单的方法然而,这实际上相当于硬编码他和程序中如何创建对象管理有关。多数情况下,创建对象的本意随着程序的需求而不同,将创建一个抽象成一个专门的“创造器”类、,会使程序更加灵活、更通用工厂模式(Factory Method Pattern) 提供了一个简单的决策类,他根据提供的数据反回一个抽象基类的多个子类中的一个。
    抽象工厂模式(Abstract Factory Pattern)提供了一个创建并返回一系列相关对象的接口。
    单例模式(Singleton Pattern)是指某个类只能有一个实例。它提供一个访问该实例的全局访问点。
    生成器模式(Builder Pattern)将一个复杂的对象的构建与他的表示分开,这样就能根据程序的需要创建不同的表现形式。
    原型模式(Prototype Pattern)是先实例化一个类,然后拷贝或克隆该类来创建新的实例,可以用共有方法进一步修改这个实例
    简单工厂
    简单共产模式根据提供给他的数据,返回几个可能类中的一个实例,通常他返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,
    而且根据不同的数据进行了优化,简单共产模式实际上不属于23GoF模式。

    为了理解简单共产模式,我们来看下图。在该图中,X是一个基类,XY类和XZ类是他派生出来的、XFactory类根据给出的参数决定返回哪个一个子类 。
    在右边定义了一个getClass方法,传递给他某个值如(abc),然后放回类X的某个实例,返回哪一个类的实例与程序员无关,
    因为这些类有同样的方法,只是实现不同。返回那一个类的实力完全取决于工厂,工厂功能可能很复杂,但通常都很简单


    下来我们看个例子
    假设我们有一个窗体,窗体上边一个输入框只允许输入名字姓和名用","来分割是姓和名
    首先构建一个基类
    Namer

    using System;
    2
    3 namespace NameFactory
    4 {
    5 /// <summary>
    6 /// Summary description for Namer.
    7 /// </summary>
    8 //Base class for getting split names
    9 public class Namer {
    10 //parts stored here
    11 protected string frName, lName;
    12
    13 //return first name
    14 public string getFrname(){
    15 return frName;
    16 }
    17 //return last name
    18 public string getLname() {
    19 return lName;
    20 }
    21 }
    22 }

    派生两个子类,接下来编写两个简单的派生类,他们实现了接口,在构造函数中将名字分成两个部分。
    在firstFirst类中。做了一个简单的假设:最后一耳光空格前面所有的部分都属于姓"firstname"

    using System;
    2
    3 namespace NameFactory
    4 {
    5 /// <summary>
    6 /// Summary description for FirstFirst.
    7 /// </summary>
    8 public class FirstFirst : Namer
    9 {
    10 public FirstFirst(string name)
    11 {
    12 int i = name.IndexOf (" ");
    13 if(i > 0) {
    14 frName = name.Substring (0, i).Trim ();
    15 lName = name.Substring (i 1).Trim ();
    16 }
    17 else {
    18 lName = name;
    19 frName = "";
    20 }
    21 }
    22 }
    23 }

    在lastfirst、类中,用逗号给lastname划分界限。当空格逗号不存在是,两个类都提供了错误处理

    1 using System;
    2
    3 namespace NameFactory
    4 {
    5 /// <summary>
    6 /// Summary description for LastFirst.
    7 /// </summary>
    8 public class LastFirst : Namer
    9 {
    10 public LastFirst(string name) {
    11 int i = name.IndexOf (",");
    12 if(i > 0) {
    13 lName = name.Substring (0, i);
    14 frName = name.Substring (i 1).Trim ();
    15 }
    16 else {
    17 lName = name;
    18 frName = "";
    19 }
    20 }
    21 }
    22 }

    工厂

    1 using System;
    2
    3 namespace NameFactory
    4 {
    5 /// <summary>

    6 /// Summary description for NameFactory.
    7 /// </summary>

    8 public class NameFactory {
    9 public NameFactory() {}
    10
    11 public Namer getName(string name) {
    12 int i = name.IndexOf (",");
    13 if(i > 0)
    14 return new LastFirst (name);
    15 else
    16 return new FirstFirst (name);
    17 }
    18 }
    19 }

    使用工厂

    1 Namer nm = nameFact.getName (txName.Text );
    2 txFirst.Text = nm.getFrname ();
    3 txLast.Text = nm.getLname ();

    简单工厂具有同样方法类 的实例,他可以是不同派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。不管是哪种形式,这些类实例中的方法必须是相同的

  • 相关阅读:
    如何借助BM算法轻松理解KMP算法
    如何实现文本编辑器中的查找替换功能?——BF算法
    C++中求数组长度与memset的用法
    什么是素数/质数/合数
    深度和广度优先搜索:如何找出社交网络中的三度好友关系?
    如何存储微博、微信等社交网络中的好友关系?
    为什么说堆排序没有快速排序快?
    HTML5中标记与特殊属性
    margin外边距问题
    html热点区域
  • 原文地址:https://www.cnblogs.com/jameslif/p/2494199.html
Copyright © 2011-2022 走看看