设计模式(2)——创建型模式

news/2024/6/29 16:16:39 标签: 设计模式, class, string, sql server, user, insert
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

         

        对class="tags" href="/tags/SheJiMoShi.html" title=设计模式>设计模式学了有一段的时间了,class="tags" href="/tags/SheJiMoShi.html" title=设计模式>设计模式是软件工程的基石,他是人们反复使用的,程序员们几十年的经验总结,以“开放—封闭”、“单一职责”、“依赖倒转”、“里氏代换”、“合成聚合复用”、“迪米特法则”、“接口隔离”为基本原则。


         本篇博客我对创建型模式进行总结,其中包括:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。


1.      单例模式

        这是最简单的一个模式,保证一个类仅有一个实例,并提供一个访问他的全局访问点。可以严格的控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。它的秘密武器是创建私有的构造函数。(就像中国只能有一个,任何人不可分割)

UML图:


代码:

class="language-csharp">namespace 单例模式
{
    class Class1
    {
        static void Main(string[] args)
        {
            Singleto s1 = Singleto.GetInstance();
            Singleto s2 = Singleto.GetInstance();
            //Singleto s3 = new Singleto();
            if (s1 == s2)
            {
                Console.WriteLine("两个对象是相同的实例");
            }
            Console.Read();
        }
    }
    class Singleto
    {
        private static Singleto instance;

        private Singleto() //让构造方法私有,不能使用new实例化
        { }

        public static Singleto GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleto();
            }
            return instance;
        }
    }
}



2 . 工厂方法模式

       定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(就像服装生产工厂,有专门生产袜子的工厂,有专门生产内衣的工厂)

UML图:



代码:

class="language-csharp">namespace 工厂模式
{
    class Class1
    {
        static void Main(string[] args)
        {
            IFactory operFactory = new AddFactory();
            Operation oper = operFactory.CreateOperation();
            oper.NumberA = 1;
            oper.NumberB = 2;
            double result = oper.GetResult();
            Console.WriteLine(result );
        }
    }
    interface IFactory   //工厂接口
    {
        Operation CreateOperation();
    }
    class AddFactory : IFactory    //加法工厂
    {

        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
    class SubFactory : IFactory    //减法工厂
    {

        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    class MulFactory : IFactory    //乘法工厂
    {

        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    class DivFactory : IFactory    //除法工厂
    {

        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

public class Operation         //抽象运算类
    {
        private double _numberA = 0;
        private double _numberB;
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        public virtual double GetResult()
        {
            double result=0;
            return result;
        }
    }
    class OperationAdd : Operation        //加法类
    {
        public override double GetResult()
        {
            double result=0;
            result = NumberA + NumberB;
            return result;
        }
    }
    class OperationSub : Operation        //减法类
    {
        public override double GetResult()
        {
            double result=0;
            result = NumberA - NumberB;
            return result;
        }
    }
    class OperationMul : Operation        //乘法类
    {
        public override double GetResult()
        {
            double result=0;
            result = NumberA * NumberB;
            return result;
        }
    }
    class OperationDiv : Operation        //除法类
    {
        public override double GetResult()
        {
            double result=0;
            if (NumberB == 0)
                throw new Exception("除数不能为0");
            result = NumberA /NumberB;
            return result;
        }
    }


}

3 . 抽象工厂模式

       提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,创建不同的产品对象,客户端应使用不同的具体工厂(就像adidas工厂专门生产这个牌子的鞋、衣服、等装备,NIKE专门生产这个牌子的鞋、衣服、等装备)

UML图:



代码:

class="language-csharp">namespace 抽象工厂模式
{
    class Class2
    {
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();

            //IFactory factory = new SqlServerFactory2();
            IFactory2 factory = new AccessFactory2();
            IUser iu = factory.CreateUser();

            iu.Insert(user);
            iu.GetUser(1);

            IDepartment id = factory.CreateDepartment();
            id.Insert(dept);
            id.GetDepartment(1);

            Console.Read();
        }
    }
    class Department
    {
        private int _id;
        public int ID
        {
            get{return _id ;}
            set{_id=value ;}
        }

        private string _deptName;
        public string DeptName
        {
            get{return _deptName ;}
            set{_deptName =value ;}
        }
    }
    interface IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    }
    class SqlserverDepartment : IDepartment
    {

        public void Insert(Department department)
        {
            Console.WriteLine("在SQL Server中给Department表增加一条记录");
        }

        public Department GetDepartment(int id)
        {
            Console.WriteLine("在SQL Server中根据ID得到Department表的一条记录");
            return null;
        }
    }
    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Access中给Department表添加一条记录");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据ID得到Department表的一条记录");
            return null;
        }
    }
    interface IFactory2
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    }
    class SqlServerFactory2 : IFactory2
    {

        public IUser CreateUser()
        {
            return new SqlserverUser1();
        }

        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment() ;
        }
    }
    class AccessFactory2 : IFactory2
    {

        public IUser CreateUser()
        {
            return new AccessUser1();
        }

        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
}
interface IUser      //用户接口
    {
        void Insert(User user);
        User GetUser(int id);
    }
    class SqlserverUser1 : IUser
    {

        public void Insert(User user)
        {
            Console.WriteLine("在sql server中给User表增加一条记录");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
            return null;
        }
    }
    class AccessUser1 : IUser
    {

        public void Insert(User user)
        {
            Console.WriteLine("在Access表User中增加一条记录");            
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据ID得到User表一条记录");
            return null;
        }
    }

}



4. 建造者模式

        将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(就像盖一个大楼,房地产商要先找挖地基的工人干活,再找盖楼的人干活,再找做外围包装的工人干活)

UML图:


代码:

class="language-csharp">namespace 建造者模式
{
    class Class2
    {
        static void Main(string[] args)
        {
            Director2 director = new Director2();
            Builder2 b1 = new ConcreateBuilder1();
            Builder2 b2 = new ConcreateBuilder2();
            
            director.Construct(b1);
            Product p1 = b1.GetResult();
            p1.Show();

            director.Construct(b2);
            Product p2 = b2.GetResult();
            p2.Show();

            Console.Read();
        }
        
    }
    class Product              //产品类,由多个部件构成
    {
        IList<string> parts = new List<string>();

        public void Add(string part)
        {
            parts.Add(part);
        }
        public void Show()
        {
            Console.WriteLine("\n产¨²品¡¤ 创ä¡ä建¡§—a—a");
            foreach (string part in parts)     //列出所有产品的部件
            {
                Console.WriteLine(part );
            }
        }
    }
    abstract class Builder2   //抽象建造者,确定建造者的组成部分
    {
        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract Product GetResult();
    }
    class ConcreateBuilder1 : Builder2    //具体建造者ConcreateBuilder1——工人
    {
        private Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("部件A");
        }

        public override void BuildPartB()
        {
            product.Add("部件B");
        }

        public override Product GetResult()
        {
            return product;
        }
    }
    class ConcreateBuilder2 : Builder2    //具体建造者ConcreateBuilder2——工人
    {
        private Product product = new Product();
        public override void BuildPartA()
        {
            product.Add("部件X");
        }

        public override void BuildPartB()
        {
            product.Add("部件Y");
        }

        public override Product GetResult()
        {
            return product;
        }
    }

    class Director2  //指挥者类——设计师
    {
        public void Construct(Builder2 builder)
        {         //用来指挥建造者的过程
            builder.BuildPartA();
            builder.BuildPartB();
        }
    }
}

5. 原型模式

        用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。秘密武器:克隆自身(不知道大家见过做月饼的模子没有,就像它,用这个模子可以做出一个一样的东西,做出来之后还可以稍微修改一下成为你想要的形状)

UML图:


代码:

class="language-csharp">//9.5简历的浅复制
namespace 原型模式
{
    class Class3
    {
        static void Main(string[] args)
        {
            Resume2 a = new Resume2("大鸟");
            a.SetPersonalInfo("男","29");
            a.SetWorkExpersonalInfo("1998-2000","XX公司");

            Resume2 b = (Resume2)a.Clone();
            b.SetWorkExpersonalInfo("2000-2006","YY公司");

            Resume2 c = (Resume2)a.Clone();
            c.SetPersonalInfo("男","33");
            c.SetWorkExpersonalInfo("1900-1937","ZZ公司");

            a.Display();
            b.Display();
            c.Display();

            Console.Read();
        }
    }
    class WorkExperience       //工作经历
    {
        private string workDate;
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        private string company;
        public string Company
        {
            get { return company; }
            set { company = value; }
        }
    }
    class Resume2 : ICloneable      //简历
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;

        public Resume2(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }
        public void SetWorkExpersonalInfo(string workDate, string company)
        {
            work.WorkDate = workDate;
            work.Company = company;
        }
        public void Display()
        {
            Console.WriteLine("{0}{1}{2}",name,sex,age );
            Console.WriteLine("工作经历:{0}{1}",work.WorkDate,work.Company );
        }

        /* MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新的对象
         * 然后将当前对象的非静态字段复制到该新对象,如果字段是子类型
         * 则对该字段进行逐位的复制,如果是引用则复制引用但不复制
         * 引用的对象;因此,原始对象及其副本引用同一对象
         */ 
        public Object Clone()
        {
            return (Object)this.MemberwiseClone();    //浅复制,引用都指向同一个对象
        }
    }
}











http://www.niftyadmin.cn/n/1705635.html

相关文章

安卓自动化测试之MonkeyRunner环境的搭建

最近在抽时间学习一些安卓自动化的知识&#xff0c;把学到东西都就记录下来&#xff0c;避免以后记性不好忘记&#xff0c;也方便对自己积累知识的查阅 MonkeyRunner是基于坐标点来操作控件的&#xff0c;你可以通过写python脚本来调用monkeyrunner api对安卓的app进行自动化测…

【JAVA】当finally遇上return

当finally遇上return 刚学异常捕获机制时&#xff0c;会有这么一个问题&#xff0c;当try中出现return语句时&#xff0c;那么finally语句还会不会执行呢&#xff1f; 先从一道代码题入手&#xff0c;那么该段代码的输出是什么呢&#xff1f; public static int testFinally…

【leetcode.46】全排列

全排列 一、要求 给定一个没有重复数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ] 二、思路 进入初始方法中&#xff0c;第一层循环内&#xff0c;选定【1&#xff0c;2&#xff0c;3】中…

设计模式(3)——结构性模式

在结构型模式中包含七种模式&#xff1a;适配器模式、装饰模式、桥接模式、组合模式、享元模式、代理模式、外观模式。 6. 适配器模式 将一个类的接口转换为客户希望的一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。相当于一个翻译的作用&#xff08;就…

【JAVA学习】正则表达式学习记录(1)

正则表达式学习记录&#xff08;1&#xff09; 有一次在面试的过程中&#xff0c;被问到了正则表达式&#xff0c;这一下触碰到了我的知识盲区了&#xff0c;虽然我目前还没怎么用到过正则&#xff0c;不过还是先学习一番吧。 package day1105;import java.io.*; import java…

连续子数组最大和(转)

求一个数组的相加和最大的连续子数组 思路&#xff1a; 一直累加&#xff0c;只要大于0&#xff0c;就说明当前的“和”可以继续增大&#xff0c; 如果小于0了&#xff0c;说明“之前的最大和”已经不可能继续增大了&#xff0c;就从新开始&#xff0c; resultmax{resultarr[i]…

设计模式(4)——行为型模式1

本篇博客我们说的是行为型模式&#xff0c;其中包括以下一种模式&#xff1a;观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。 13.管擦者模式 定义了一种一对多的依赖关系&#xff0c;让…

【JAVA学习】如何输出一个路径底下的所有目录、文件以及目录中的文件

如何输出一个路径底下的所有目录、文件以及目录中的文件 一、设计思路 想得到某一个路径的File对象&#xff0c;如果该对象是目录的话&#xff0c;则使用该对象的listFiles列出该目录底下的所有file对象&#xff0c;形成file数组&#xff0c;遍历该file数组&#xff0c;对数组…