单例模式和工厂模式的简单理解

//什么是单例模式?//单例模式就是在核心就够中只包含一个被称作单例的特殊的类,通过单例模式可以保证系统中一个类只有一个实例,也就是说一个类只有一个对象实例using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class danli
    {
        static void Main(string[] args)
        {
            sing Instance = sing.GetInstance();
            sing Instance2 = sing.GetInstance();
            if (Instance == Instance2)
                Console.WriteLine("xiangtong");//判断实例是否建立成功
            Console.ReadKey();
        }
    }
    //建立一个设置单例的类
    class sing
    {
        private static sing _Instance = null;//定义一个单例的实例
        public static sing GetInstance()//获取一个对象
        {
            if (_Instance == null)
                _Instance = new sing();
            return _Instance;
        }
    }

}

从图中可以看出实例化出来的Instance和Instance2实际上是一样的,也就是说在运行GetStance方法之后,因为先创建了Instance,所以在创建Instance2时不满足if条件依旧返回Instance;

我们可以在用一个简单的例子来说明一下单例模式的工作模式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class danli
    {
        static void Main(string[] args)
        {
            sing Instance = sing.GetInstance();
            sing Instance2 = sing.GetInstance();

Person.Change();
            Console.WriteLine(Instance2.i);
            Console.ReadKey();
        }
    }

    public class Person
    {
        public static void Change()
        {
            sing Instance = sing.GetInstance();
            Instance.i = 10;
        }
    }

    //建立一个单例特殊类
    class sing
    {
        public int i = 1;
        //private sing() { }
        private static sing _Instance = null;//定义一个单例的实例
        public static sing GetInstance()//获取一个对象
        {
            if (_Instance == null)
                _Instance = new sing();
            return _Instance;
        }
    }

}

最初的时候调用特殊类并且设置i=1,对象实例化后Instance.i=1,经过Change方法之后设置Instance.i=10;

输出Instance2.i结果是10.

若非单例情况下,Instance.i的值应该是不确定的,从这也就可以说明,单例模式就是创建一个特殊的类,这个类只能有一个实例的对象,实际上Instance2=return Instance。

————————————————————————————————————————————————————————————————————————————我是快乐的分割线~~~~~~~

下面来说一下什么是工厂模式:

【偷个懒复制一下】:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

老规矩用代码来显示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    //电脑抽象类
    public abstract class Computer
    {
        public abstract void print();
    }

    public  class Lenovo:Computer
    {
        public override void print()
        {
            Console.WriteLine("This is a Lenovo Computer");
        }
    }

    public class AUSU:Computer
    {
        public override void print()
        {
            Console.WriteLine("This is a AUSU Computer");
        }
    }
    //选择实例化对象的类型
    public class Make
    {
        public static Computer Create(string Type)
        {
            Computer com = null;
            if(Type=="联想")
            {
                com = new Lenovo();
            }
            else if(Type=="华硕")
            {
                com = new AUSU();
            }
            return com;
        }
    }

    class danli
    {
        static void Main(string[] args)
        {
            //运用工厂模式实例化对象
            Computer com = Make.Create("联想");
            com.print();
            Console.ReadKey();
        }
    }

}

这个代码是先定义了一个电脑的抽象类,然后通过选择所要实例化出来的电脑的类型来制作方法Create;这个制作方法就相当与一个工厂,这个工厂只能加工联想和华硕的电脑,当然我们也可以“扩大”工厂的生产类型,从而生产其他类型的电脑,但是这种方法显然有一个弊端,就是当这个工厂坏掉之后,所有在这个工厂里加工的电脑都是不能在加工了,然后解决这个问题呢?

这就需要来抽象化工厂了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    //电脑抽象类
    public abstract class Computer
    {
        public abstract void print();
    }

    public  class Lenovo:Computer
    {
        public override void print()
        {
            Console.WriteLine("This is a Lenovo Computer");
        }
    }

    public class AUSU:Computer
    {
        public override void print()
        {
            Console.WriteLine("This is a AUSU Computer");
        }
    }
    //工厂抽象
    public abstract class Creater
    {
        public abstract Computer CreateComputer();
    }
    //联想工厂抽象
    public class CreaterLenovo :Creater
    {
        public override Computer CreateComputer()
        {
            return new Lenovo();
        }
    }
    //华硕工厂抽象
    public class CreaterAUSU:Creater
    {
        public override Computer CreateComputer()
        {
            return new AUSU();
        }
    }

    //public class Make
    //{
    //    public static Computer Create(string Type)
    //    {
    //        Computer com = null;
    //        if(Type=="联想")
    //        {
    //            com = new Lenovo();
    //        }
    //        else if(Type=="华硕")
    //        {
    //            com = new AUSU();
    //        }
    //        return com;
    //    }
    //}

    class danli
    {
        static void Main(string[] args)
        {
            //利用工厂模式实例化对象
            Creater cr = new CreaterAUSU();//实例化华硕工厂
            Computer com = cr.CreateComputer();//在联想工厂里面实例化华硕电脑这个实例
            com.print();
            Console.ReadKey();
        }
    }

}

抽象化工厂其实和抽象化电脑的思路是一样的,代码也是很简单的,很容易看明白

我是一只小菜鸡啊小菜鸡    ~~~~~

时间: 2024-10-13 04:55:34

单例模式和工厂模式的简单理解的相关文章

(四)单例模式与工厂模式

在未读<JavaScript设计模式>这本书前,在我的印象里,单例模式就是每个类只会产生一个实例,非常简单.在细看到这个模式时候,有些疑惑单例模式与工厂模式的区别,虽然看起来像最大区别在于是否多次实例化. 单例(Singleton)模式 单例模式它限制了类的实例化次数只能一次.在实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例:如果实例已经存在,它会简单返回该对象的引用.(这跟我想的一样) 例子: var mySingleton = (function () { // Ins

对比总结三个工厂模式(简单工厂,工厂方法,抽象工厂)

前言 简单工厂模式,工厂方法模式,抽象工厂模式,这三个模式,当然还有单例模式,建造者模式等等,应该是日常工作中常用的,尤其是工厂模式,应该是最最常见的模式,对理解面向对象有重要的实际意义. 简单工厂模式 最简单,最直接,能满足大部分日常需求,不足是工厂类太简单——无法满足开闭原则,对多个产品的扩展不利 工厂方法模式——交给子类去创建 工厂方法模式,有了进步,把工厂类进行改进,提升为一个抽象类(接口),把对具体产品的实现交给对应的具体的子类去做,解耦多个产品之间的业务逻辑. 前面都是针对一个产品族

前端设计模式——单例模式和工厂模式

作为一个前端新人,学习了设计模式以后,希望能从源头上,用浅显易懂的语言来解释它.当然不一定是正确的,只是我个人对设计模式的一点浅显理解. 创建型设计模式 创建型设计模式:故名思意,这些模式都是用来创建实例对象的. 单例模式:首先我们需要理解什么是单例.单:指的是一个.例:指的是创建的实例.单例:指的是创建的总是同一个实例.也就是使用类创建的实例始终是相同的.我们先看下面的一段代码: class Person{ constructor(){} } let p1 = new Person(); le

常见的设计模式:单例模式、工厂模式、观察者模式、装饰模式与适配器模式

常见的设计模式:单例模式.工厂模式.观察者模式.装饰模式与适配器模式 这里可以阅读Terry Lee的设计模式系列来理解学习一下 1.4.1 单例模式 .NET设计模式(2):单件模式(Singleton Pattern)  http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 1.4.2 抽象工厂模式 .NET设计模式(3):抽象工厂模式(Abstract Factory) http://terrylee.cnblogs.com/

有关反射和简单工厂模式的简单实现

先抛出两个概念,反射机制和简单工厂模式. 一句话谈谈自己的理解 反射机制就是由参数(包名类名的字符串),获取具体类的属性方法.简单工程模式就是由一个类作公共出口来生成其他类的实例,父类子类生成模式的简单应用,可以由参数来决定具体需要的实例.往下看,是我搜到的解释,相对完善一点. 什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.上

关于工厂模式(简单以及抽象)

简单工厂模式: 简单工厂模式可以认为是一个创建实例的过程,可以代替new的方式,创建一个新的实例.创建实例new的时候要多考虑一下,看是否可以使用工厂模式,虽然可能多做一些工作,但是系统可能会有更少程度的修改. 直白的说就是把对象创建的过程封装到一个新的类中去,比如这个类创建的初始化过程比较麻烦,按老方法就是把这些全放在这个类的构造函数中,但是这样显然不利于维护,所以就把这部分内容提取出来放到一个新的类中,这个类的某个create方法可以返回一个所需要的对象的实例. 最明显的就是容器中的使用It

审判,必须死,关于工厂模式的小小理解

不幸,你被抓住了. 明朝皇帝不会留情的.他冷笑着说:"你必须死!!!" "交给东厂,审审,决定你的死法" 这个世道啊,连死法,都和你有多少钱相关. "身上钱少于100块,吃屎到死:多于100,少于200,被袋鼠干,干死:多余200块嘛,天天看郭敬明,郁闷至死." 于是一段程序开始了: using UnityEngine; using System.Collections; public class DummyFact : MonoBehaviou

PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式

php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大浪费,在团队合作项目中,也能够避免不同的程序员实例自己的对象,造成人为的系统消耗. 单例模式的三大原则 1.构造函数需要标记为非public(防止外部使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化 2.拥有一个保存类的实例的静态成员变量$_instance 3.拥有一个可

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html {<HeadFirst设计模式>工厂模式之简单工厂 } 3{ 产品类 } 4{ 编译工具 :Delphi7.0 } 5{ 联系方式 :[email protected]com } 6 7unit uProducts; 8 9interface 10 11type 12 TPizza = class(