• Factory Method 工厂方法


    从耦合关系谈起
          耦合关系直接决定着软件面对变化时的行为
          – 模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改
          – 模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变

    动机(Motivation)
          在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
          如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中

    意图(Intent)
    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。——《设计模式》GoF

    结构(Structure)

    image

    Factory Method模式的几个要点

    1. Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
    2. Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
    3. Factory Method模式解决“单个对象”的需求变化,Abstract Factory 模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。

    代码:

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace testWpf
    {
        
    public abstract class AbtractCar
        {
            
    public abstract void Startup();
            
    public abstract void Run();
            
    public abstract void Turn(Direction dretion);
            
    public abstract void Stop();
        }

        
    public abstract class CarFactory
        {
            
    public AbtractCar CreateCar()
            {
                
    return new HongQiCar();
            }
        }

        
    public class HongQiCar : AbtractCar
        {
            
    public override void Startup() { }
            
    public override void Run() { }
            
    public override void Turn(Direction dretion) { }
            
    public override void Stop() { }
        }

        
    public class HongqiCarFactory : CarFactory
        {
            
    public override AbtractCar CreateCar()
            {
                
    return new HongQiCar();
            }
        }



        
    public class CarTestFramework
        {

            
    public void BuidTestContext(CarFactory carFactory)
            {
                AbtractCar c1 
    = carFactory.CreateCar();
            }

            
    public void DoTest(AbtractCar car)
            {
                car.Run();
            }
            
            
    public Car GetTestData(AbtractCar car)
            {
                
    return car;
            }
        }

        
    public class App
        { 
            
    public static void Main()
            {
                CarTestFramework carTestFramework 
    = new CarTestFramework();
                
    //carTestFramework.BuidTestContext(new DongFengCarFactory());

                
    //让子类决定实例化哪一个类
                carTestFramework.BuidTestContext(new HongqiCarFactory());
                
            }
        }

    }
  • 相关阅读:
    P1886 滑动窗口 单调队列
    用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...
    用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...
    SaltStack入门
    编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    time模块中time.time与time.sleep
    【函数篇】装饰器
    【函数篇】函数的进阶,名称空间、作用域、函数的嵌套、作用域链
    闭包!!!
    默认参数的陷阱
  • 原文地址:https://www.cnblogs.com/timy/p/1623312.html
Copyright © 2020-2023  润新知