zoukankan      html  css  js  c++  java
  • 生成器模式

    生成器模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    我们先来看一个简单的例子,比如说Product类是一个复杂的类,构建它需要许多步骤

    class Product
    {
        List<string> parts = new List<string>();
        public void Add(string part)
        {
             //添加产品部件
             parts.Add(part);
        }
    }

    我们需要定义一个抽象的生成器类Builder,来定义构建Product的步骤

    abstract class Builder
    {
        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract void BuildPartC();
        public abstract void BuildPartD();
        public abstract Product GetResult();
    }

    我们需要定义具体的生成器类ConcreteBuilderOne、ConcreteBuilderTwo来实现Builder (即复杂对象的表示)

    abstract class ConcreteBuilderOne
    {
        private Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("添加部件A");
        }
        public override void BuildPartB()
        {
            product.Add("添加部件B");
        }
        public override void BuildPartC()
        {
            product.Add("添加部件C");
        }
        public override void BuildPartD()
        {
            product.Add("添加部件D");
        }
        public override Product GetResult()
        {
             return product;
        }
    }
    abstract class ConcreteBuilderTwo
    {
        private Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("添加部件A");
        }
        public override void BuildPartB()
        {
            product.Add("添加部件B");
        }
        public override void BuildPartC()
        {
            product.Add("添加部件C");
        }
        public override void BuildPartD()
        {
            product.Add("添加部件D");
        }
        public override Product GetResult()
        {
             return product;
        }
    }

    接下来我们需要定义一个叫Director的类,我们叫它指挥者类(它负责复杂对象的构建)

    class Director
    {
        public void Construct(Builder builder)
        {
             builder.BuildPartA();
             builder.BuildPartB();
             builder.BuildPartC();
             builder.BuildPartD();
        }
    }

    下面我们就可以在客户端构建对象了

    static void Main(string[] args)
    { 
        Director director = new Director();
        Builder one = new ConcreteBuilderOne();
        Builder two = new ConcreteBuilderTwo();
        
        director.Construct(one);
        Product p1 = one.GetResult();
    
        director.Construct(two);
        Product p2 = two.GetResult();
    }

    通过上面的代码可以很容易看出,生成器模式使得构建对象的过程独立出来放到指导者类里,它不负责具体每步的实现,具体的实现放到生成器类里,这样它们就分离开来了。指导者就是可以重用的构建过程,而生成器是可以被切换的具体实现。

    生成器模式的结构图如下:

    生成器模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。具体的构造实现可以很方便的扩展和切换。

    值得一提的是,在前面的例子里,指导者仅仅是简单地调用了生成器的方法,实际上可能回事比较复杂的算法,指导者和生成器是需要交互的,比如:1.运行指导者时,会按照整体构建算法的步骤进行运算,可能先运算前几部,到了某一步,需要调用Builder创建某个部件对象了,在调用Builder时可能会把前面运算的数据传给Builder。2.Builder创建好部件对象后可能需要返回该对象供指导者使用。 3.如此反复下去,直到整个构建算法运行完成,最终产品也就创建完了。

    生成器模式的本质:分离整体构建算法和部件构造。

  • 相关阅读:
    爬虫实战篇(模拟登录)---我们以模拟去哪儿网为例
    requests库详解
    爬取拉钩网职位信息写入mongodb数据库(小白学爬虫--实战篇1)
    《Vue项目关于i18n双语切换》
    《Vue+Vuetify》
    《Vue项目的创建以及初始化(两种方法)》
    《关于Vue的涟漪点击》
    《Vue的父子组件传值》
    《vue 页面进出类似APP的滑动效果》
    《Vue里的路由拦截》
  • 原文地址:https://www.cnblogs.com/hanmeimei/p/4610576.html
Copyright © 2011-2022 走看看