• 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());
                
            }
        }

    }
  • 相关阅读:
    Hard Rock
    Codeforces Round #416 (Div. 2) B. Vladik and Complicated Book
    codeforces 793B. Igor and his way to work
    codeforces 1B Spreadsheets
    HDU 1069 Monkey and Banana
    codeforces 2B The least round way
    【机器学习】 通俗说拟合
    python-八皇后问题
    python-核心知识思维导图
    python-@property 属性
  • 原文地址:https://www.cnblogs.com/timy/p/1623312.html
Copyright © 2020-2023  润新知