zoukankan      html  css  js  c++  java
  • 工厂方法模式(Factory Method)

    重要概念

    本章内容围绕简单工厂与工厂方法的比较很好的说明了工厂方法模式。

    1.简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除类与具体产品的依赖,且无需修改代码,因为逻辑已经包含在了工厂类当中。

    2.工厂方法模式定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到子类。

    image

    3.实际上封装实例化对象的方法都叫做工厂方法,未必非要去继承中获得工厂方法接口,当然继承的目的是可以更好的扩展。

    4.工厂方法模式实例化时,客户端需要决定实例化那个工厂来实现运算类,选择判断的问题还是存在,也就是工厂方法把简单工厂的内部逻辑判断移动到了客户端代码来进行。想要添加功能,本来是改工厂类的,而现在是修改客户端了。

    5.简单工厂和工厂方法的区别,简单工厂把生成逻辑放到工厂类中,工厂方法把生成方法放到子类中去扩展,这样在工厂类的角度说是无需修改工厂类本身即可达到扩展,符合开闭原则,简单工厂的实现需要在工厂中加入逻辑修改原有的判断。

    6.工厂方法从方便性上也许没有简单工厂实用,但是工厂方法客服了简单工厂违背开闭原则的缺点,又保持了封装对象创建过程的优点,需要添加修改时,只需添加相应的工厂方法扩展,而无需像简单工厂一样去修改工厂类,但判断逻辑被移动到了客户端的部分。

    7.工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且客服了他的缺点,但他的缺点是由于每添加一个产品,就需要加一个产品工厂的类,还有就是无法避免修改客户端的代码。

    基础例题

    学雷锋

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 工厂方法_雷锋工厂
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                //
                //基本方式:薛磊风代表大学生学习雷锋
                LeiFeng xueleifeng = new Undergraduate();
    
                xueleifeng.BuyRice();
                xueleifeng.Sweep();
                xueleifeng.Wash();
    
    
                LeiFeng student1 = new Undergraduate();
                student1.BuyRice();
                LeiFeng student2 = new Undergraduate();
                student2.Sweep();
                LeiFeng student3 = new Undergraduate();
                student3.Wash();
    
    
    
                //简单工厂模式
                LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
                studentA.BuyRice();
                LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
                studentB.Sweep();
                LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
                studentC.Wash();
    
    
                //工厂方法模式
                IFactory factory = new UndergraduateFactory();
                LeiFeng student = factory.CreateLeiFeng();
    
                student.BuyRice();
                student.Sweep();
                student.Wash();
    
                Console.Read();
            }
        }
    
        //雷锋
        class LeiFeng
        {
            public void Sweep()
            {
                Console.WriteLine("扫地");
            }
    
            public void Wash()
            {
                Console.WriteLine("洗衣");
            }
    
            public void BuyRice()
            {
                Console.WriteLine("买米");
            }
        }
    
        //学雷锋的大学生
        class Undergraduate : LeiFeng
        { }
    
        //社区志愿者
        class Volunteer : LeiFeng
        { }
    
        //简单雷锋工厂
        class SimpleFactory
        {
            public static LeiFeng CreateLeiFeng(string type)
            {
                LeiFeng result = null;
                switch (type)
                {
                    case "学雷锋的大学生":
                        result = new Undergraduate();
                        break;
                    case "社区志愿者":
                        result = new Volunteer();
                        break;
    
                }
                return result;
            }
        }
    
        //雷锋工厂
        interface IFactory
        {
            LeiFeng CreateLeiFeng();
        }
    
        //学雷锋的大学生工厂
        class UndergraduateFactory : IFactory
        {
            public LeiFeng CreateLeiFeng()
            {
                return new Undergraduate();
            }
        }
    
        //社区志愿者工厂
        class VolunteerFactory : IFactory
        {
            public LeiFeng CreateLeiFeng()
            {
                return new Volunteer();
            }
        }
    
    }
    冯瑞涛
  • 相关阅读:
    java运行时异常与一般异常有何异同?
    B+树原理及mysql的索引分析
    ibatis in的用法
    brython的问题
    限流算法的原理
    Java8的CompletionService使用与原理
    命令行相关快捷键
    Java8 异步编排类CompletableFuture
    分布式系统ID生成方案
    curl 命令简介
  • 原文地址:https://www.cnblogs.com/finehappy/p/1614358.html
Copyright © 2011-2022 走看看