简单工厂形式

简易工厂格局介绍:

一言以蔽之工厂情势是属于创制型格局,又称之为静态工厂方法(Static Factory
Method)格局,但不属于23种GOF设计情势之一。简单工厂情势是由1个厂子对象说了算创设出哪个种类产品类的实例。不难工厂情势是工厂形式家族中最不难易行实用的方式,能够明白为是见仁见智工厂方式的3个独特达成。

结构方式图:

bifa365必发 1

剧中人物分类:

工厂(Creator)角色

粗略工厂方式的骨干,它肩负落到实处创造全数实例的内部逻辑。工厂类的创造产品类的点子能够被外边直接调用,创设所需的出品对象。

空泛产品(Product)剧中人物

粗略工厂形式所开创的拥有指标的父类,它担负描述全部实例所共有的公家接口。

具体产品(Concrete Product)剧中人物

是简约工厂情势的创制指标,全部创建的靶子都是充当这几个剧中人物的某部具体类的实例。

引入实况:

若是有一个居家管理种类,里面包车型地铁每户类型是可变的,每一个租户类型的租金计算公式都留存出入

A类型的人家租金额=天数*bifa365必发,单价+绩效*0.005

B类型的每户租金额=月份*(每月价格+performance*0.001)

分析:

1.
店铺存在共有的估算形式,那是实业公司的表现,然则他们的表现的章程不同,全数大家抽象商店类,代码如下:

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

namespace SimpleFactory.App.IFactroy
{

    public interface Ishop
    {
        double Getrent(int days, double dayprice, double performance);
    }
}

2.在架空了同盟社之后,大家要对创设具体产品类,那里正是具体的门类同盟社,里面完结该集团的一颦一笑格局。创造A类型的商行

using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactory.App.product
{
    //A类型的商店的创建
    public class Ashop:Ishop
    {
        /// <summary>
        /// /// A类型商店租金额,天数*单价+绩效*0.005
        /// </summary>
        /// <param name="days">天数</param>
        /// <param name="dayprice">每天单价</param>
        /// <param name="performance">日平均绩效</param>
        /// <returns></returns>
        public double Getrent(int days, double dayprice, double performance)
        {
            Console.WriteLine("A商店的租金算法");
            return days * dayprice + performance * 0.01;
        }
    }
}

3.创办B类型的店铺:

using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactory.App.product
{
    /// <summary>
    /// B类型的商店的创建
    /// </summary>
    public class Bshop:Ishop
    {

        /// <summary>
        /// B类型商店的租金=月份*(每月价格+performance*0.001)
        /// </summary>
        /// <param name="month">月数</param>
        /// <param name="monthprice">月单价</param>
        /// <param name="performance">月平均绩效</param>
        /// <returns></returns>
        public double Getrent(int month, double monthprice, double performance)
        {
            Console.WriteLine("B商店的租金算法");
            return month * (monthprice + performance * 0.001);
        }
    }
}

4.
在开创号项目合营社并落实况势后,思考在哪些处境下哪些创立那种对象,于是简单工厂情势中最基本的有些:工厂类出来了

using SimpleFactory.App.IFactroy;
using SimpleFactory.App.product;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactory.App.factoryMethod
{
    public class factorymethod
    {
        public Ishop CreateShow(string show)
        {
            switch (show.Trim().ToLower())
            {
                case"ashop":
                    return new Ashop();
                case "bshop":
                    return new Ashop();
                default:
                    throw new Exception("该商店不存在");
            }
        }
    }
}

5.然后就依照近期的商行类型举行判定,该项目标集团应该举办哪种算法:

using SimpleFactory.App.factoryMethod;
using SimpleFactory.App.IFactroy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactory.App
{
    class Program
    {
        static void Main(string[] args)
        {
            Ishop As;
            factorymethod afm = new factorymethod();
            As = afm.CreateShow("ashop"); //a 类型的某商店
            double total = As.Getrent(30, 300, 2000);     //30 天/100元  日平均绩效为2000
            Console.WriteLine("该A类型商店的租金为:" + total);

            Console.WriteLine("=============");

            Ishop Bs;
            factorymethod bfm = new factorymethod();
            Bs = bfm.CreateShow("bshop"); //b 类型的某商店
            total = Bs.Getrent(3, 3000, 60000);          //3 月/4000元  月平均绩效为60000
            Console.WriteLine("该B类型商店的租金为:" + total);
            Console.ReadKey();
        }
    }
}

到此地大家落到实处了客户供给的三种档次公司的算法的需求,可是作为一种好的规划架构,还应当考虑到背后的供给变革,假使客户未来又充实了C类型商店和D类型商店,它们的算法需要又分裂,这么些时候大家就必要进行C,D类型商店的始建,并持续Ishop接口,完毕里面包车型地铁方法,同时还得继续修改工厂类在switc中追加case举行捕捉制造相应的公司对象,一旦出现这样的情事,是不便宜程序的扩大性和品种后期的维护性的。

优点:

  • 简单工厂方式能够基于外界给定的新闻,决定毕竟应该创立哪个具体类的对象。通过它,外界得以从一向开立具体产品对 
    象的两难局面中摆脱出来。
  • 外边与现实类隔开分离开来,偶合性低。
  • 显然区分了分其余任务和权杖,有利于整个软件连串结构的优化。

缺点:

  • 工厂类集中了颇具实例的创制逻辑,简单违反GRASPPAJERO的高内聚的义务分配原则 
  • 虽说不难工厂情势能够适应一定的转移,但是它所能化解的题材是远远少于的。它所能创立的类只好是优先教考虑到的,倘使急需添加新的类,则就须求改变工厂类了。

并发的上诉景况,应该如何化解,值得沉思,将在下四个厂子方法情势中取得很好的消除。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注