当前位置: 首页 > news >正文

工厂方法模式

 

 

 

 

 

 

下面用一个例子解释:

 

 

2个接口:电视及洗衣机

1个抽象工厂

2个具体电视机类 ,2个具体洗衣机类 ,2个具体工厂类

一个客户端

 

 //TV接口
namespace
FactoryMethodModel { interface ITV { string play(); }
}

 

  class HaierTV:ITV
    {

        public string play()
        {
            string str = "Haier电视正在播放....";
            return str;
        }
    }
  class TCLTV : ITV
    {

        public string play()
        {
            string str = "TCL电视正在播放....";
            return str;
        }
    }
namespace FactoryMethodModel
{
    interface IWashing
    {
        string washing();
    }

    class HaierWashingMachine:IWashing
    {

        public string washing()
        {
            string str = "Haier洗衣机正在洗涤....";
            return str;
        }
    }

  class TCLWashingMachine:IWashing
    {

        public string washing()
        {
            string str = "TCL 洗衣机洗涤中....";
            return str;
        }
    }
}
namespace FactoryMethodModel
{
    abstract class AbstractFactory
    {
        public abstract ITV productTV();
        public abstract IWashing productWashing();
    }
   class HaierFactory:AbstractFactory
    {

        public override ITV productTV()
        {
            return new TCLTV();
        }

        public override IWashing productWashing()
        {
            return new HaierWashingMachine();
        }
    }
   class TCLFactory:AbstractFactory
    {

        public override ITV productTV()
        {
            return new TCLTV();
        }

        public override IWashing productWashing()
        {
            return new TCLWashingMachine();
        }
    }

}

 

/*工厂方法模式*/
namespace FactoryMethodModel
{
    class Client
    {
        static void Main(string[] args)
        {
            //TotalFactory t = new TotalFactory(); //监护所有的工厂
            //t.SetFactory(new TCLFactory());
            TotalFactory t = new TotalFactory(new TCLFactory()); 
            Console.WriteLine(t.productTV().play());   
            Console.WriteLine(t.productWashingMachine().washing());
            Console.ReadKey();
        }
    }
}

 

//为了方便管理可以创建一个总工厂用来管理所有工厂
namespace FactoryMethodModel
{
    class TotalFactory
    {

        AbstractFactory abstractFactory;
        ITV tv;
        IWashing wash;
        Type factoryType;
        public TotalFactory()
        {

        }
        public TotalFactory(AbstractFactory factory)
        {
            SetFactory(factory);
        }
        public void SetFactory(AbstractFactory factory)
        {
            factoryType = factory.GetType();
            GetFactoryByType();
            abstractFactory = GetFactoryByType();
            tv = abstractFactory.productTV();
            wash = abstractFactory.productWashing();
        }
        public  AbstractFactory GetFactoryByType()
        {
            if (factoryType == typeof(TCLFactory))
            {
                return new TCLFactory();
            }
            else if (factoryType == typeof(HaierFactory))
            {
                return new HaierFactory();
            }
            else
            {
                return null;
            }
        }
        public ITV productTV()
        {
           return  tv;
        }
        public IWashing productWashingMachine()
        {
           return wash;
        }
    }
}

 

转载于:https://www.cnblogs.com/lichuangblog/p/8830901.html

相关文章:

  • Spring Cloud学习笔记-007
  • Reverse Integer
  • W650DC_DD_CFL_Win64(刷八代CPUBios)
  • Resource 的 IsSealed 问题
  • Machine Learning 第三周
  • React Native报错undefined is not an object(evaluating ‘_reactnative.propTypes’)解决办法...
  • Vue.js 子组件的异步加载及其生命周期控制
  • BZOJ 1283 序列 费用流 网络流 线性规划
  • kafka知识体系-kafka leader选举
  • 数据概述
  • winform控件大全
  • C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形
  • 设计模式体会
  • 函数参数选项的处理getopt getopt_long getopt_long_only
  • eclipse 配置多个tomcat
  • [PHP内核探索]PHP中的哈希表
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Laravel 中的一个后期静态绑定
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Mac转Windows的拯救指南
  • Markdown 语法简单说明
  • Mybatis初体验
  • node-glob通配符
  • Nodejs和JavaWeb协助开发
  • SOFAMosn配置模型
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 两列自适应布局方案整理
  • 前端js -- this指向总结。
  • 悄悄地说一个bug
  • 如何实现 font-size 的响应式
  • 试着探索高并发下的系统架构面貌
  • 小程序01:wepy框架整合iview webapp UI
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • No resource identifier found for attribute,RxJava之zip操作符
  • Java数据解析之JSON
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​业务双活的数据切换思路设计(下)
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #etcd#安装时出错
  • #在 README.md 中生成项目目录结构
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)STL算法之遍历容器
  • (70min)字节暑假实习二面(已挂)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • . Flume面试题
  • ./configure,make,make install的作用(转)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .CSS-hover 的解释