为什么要用简单工厂模式,使用简单工厂模式的优点是什么?

2020-11-23 14:10:13 字数 5957 阅读 5396

1楼:匿名用户

保证**的可复用,各个子类完全分离,避免了更高**无意中把原来好的源**改错,对于开发公司来说,个人自用负责自己对应的子类,就行了,公司也不用把别的子类给你,

***************

如果现在公司要求你为公司的薪资管理系统做维护,原来只有技术人员(月薪) ,市场销售人员(底薪+提成),经理(年薪+股份)三种运算算法,现在要增加兼职工作人员的(时薪)算法,但按照前面的程序写法,公司就必须要把包含有的原三种算法的运算类给你,让你修改,你如果心中小算盘一打,‘***,公司给我的工资这么低,我真是郁闷,这会有机会了’,于是你除了增加了兼职算法以外,在技术人员(月薪)算法中写了一句

if (员工是自己)

那就意味着,你的月薪每月都会增加10%(小心被抓去坐牢),本来是让你加一个功能,却使得原有的运行良好的功能**产生了变化,这个风险太大了。我们应该把加减乘除等运算分离,修改其中一个不影响另外的几个,增加运算算法也不影响其它**”

这时候就需要用到 简单工厂模式了

使用简单工厂模式的优点是什么?

2楼:追寻复制者

简单工厂

模式的优点:

1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;

2、简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

3、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

4、通过引入配置文件,可以在不修改任何客户端**的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

3楼:匿名用户

工厂模式就相当于创建实例对象的new,我们经常要根据类class生成实例对象,如a a=new a(). 工厂模式也是用来创建实例对象的,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

类sample为例,要创建sample的实例对象:

sample sample=new sample();

可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等

首先,我们想到的是,可以使用sample的构造函数,这样生成实例就写成:

sample sample=new sample(参数);

但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段**,如果也写入构造函数中,那你的**很难看了

初始化工作如果是很长一段**,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于java面向对象的原则,面向对象的封装(encapsulation)和分派(delegation)告诉我们,尽量将长的**分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从sample的构造函数中分离出去。

你想如果有多个类似的类,我们就需要实例化出来多个类。这样**管理起来就太复杂了。

这个时候你就可以采用工厂方法来封装这个问题。

不能再用上面简单new sample(参数)。还有,如果sample有个继承如mysample, 按照面向接口编程,我们需要将sample抽象成一个接口.现在sample是接口,有两个子类mysample 和hissample

sample mysample=new mysample();

sample hissample=new hissample();

采用工厂封装:

public class factory

} 那么在你的程序中,如果要实例化sample时.就使用

sample samplea=factory.creator(1);

举个更实际的例子,比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等,那么连接数据库的**是不一样的,你用传统的方法,就不得不进行**修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候**就不用进行修改了。

我通常都是用xml的配置文件配置许多类型的数据库连接,非常的方便。ps:工厂模式在这方面的使用较多。

4楼:匿名用户

防止对数据的破坏,实现多态。

5楼:匿名用户

可以动态创建对象~~

简单工厂就是生产对象的工厂

为什么要使用工厂模式?

6楼:

工厂这个模式它可以隐藏函数的具体实现,并且更加具有封装性,更加的面向对象,这些东西在基础的编写小程序上并体现不出什么优越性,但在一个大项目中,就显得很重要了,

打个比方就像你如果说只有两三本书,你不需要什么归类放着,但你如果有一个图书管那么多书的话,放书就要有一定的规章,章法,这样就好管理,变更,查找

7楼:樱枝残雪

更加能体现面向对象啊,封装了创建方法。更加增加了**的重用性

c#工厂模式和简单工厂模式有什么不同

8楼:匿名用户

简单工厂模式是类的创建模式,又叫做静态工厂方法模式。就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。一般涉及到三种角色(如下图):

工厂类:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的类实现。

抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或她们共同拥有的接口。一般由接口或抽象类实现。

具体产品角色:工厂方法模式所创建的任何对

象都是这个角色的实例,由具体类实现。

简单工厂模式优缺点:

模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。但由于工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。如果增加新产品必须修改工厂角色的源码。

9楼:匿名用户

多了两个字···

抽象工厂和简单抽象工厂基本原理都差不多

简单抽象工厂可能因为项目需求不同,然后在某一步骤就直接略过了比如有些是这样的

实体工厂、抽象产品、实体产品

少了一个抽象工厂,因为可能是他的项目不需要抽象工厂

工厂模式,简单工厂模式,抽象工厂模式三者有什么区别

10楼:灬nico丶

工厂模式,简单工厂模式,抽象工厂模式三者区别如下:

1、首先,三者的创建对象是不相同的。

进行创建对象时,“工厂模式”不使用new创建对象,而是使用factory模式;“简单工厂模式”则是通过fw模式来建立对象;“抽象工厂模式”使用迭代模式来创建对象。

2、其次,三者的定义变量不同。

“工厂模式”在使用时可以随时设置变量,不用提前进行设置。“简单工厂模式”中需要使用参数或者配置文件等已经定义好的变量,然后才能进行下一步的操作。“抽象工厂模式则”则需要每次增加产品时,进行修改类方法。

3、最后,三者的接口数量不同。“工厂模式”可以使用两个接口以及三个接口,“简单工厂模式”只可以使用一个接口。“抽象工厂模式”则可以使用无限个接口。

11楼:纸墨成殇

1、创建对象不同。创建对象时,“工厂模式”使用factory模式替代使用new创建对象;“简单工厂模式”使用fw模式建立对象;“抽象工厂模式”则使用迭代模式创建对象。

2、定义变量不同。“工厂模式”不用事先定义变量,使用时随时引用便可。“简单工厂模式”,使用参数或者配置文件等事先定义好的变量,然后利用分支判断初始化具体产品类并返回。

“抽象工厂模式则”不符合“开发-封闭”原则,每次增加产品,都需要修改类方法。

3、接口数量不同。“工厂模式”有两至三个接口。“简单工厂模式”只有一个接口。抽象工厂模式理论上具有无限个接口。

扩展资料

编程使用“工厂模式”的优缺点:

1、优点:

方便扩展算法,比如增加一个开根号的功能,我们只要继续继承运算类就行了,同时客户端也就是使用者不知道具体的实现细节,只要给出相关标示符,工厂函数就马上给他创建一个他想要的实体就行了。减少了使用者和功能开发者之间的耦合度。

2、缺点:

在进行扩展的时候,我们要更改工厂函数里面的那个分支语句switch,这样便破坏了ocp,而且当有多级结构继承的时候,简单工厂就会因为只能对应平行一层记得继承,不得不使得好多类继承同一个接口,然后得到a*b这么多的工厂实体可能,工厂函数很难维护。

12楼:百度用户

工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的**。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的ocp原则(open close principle),对扩放,对修改关闭。

抽象工厂模式:这个模式我总是感觉和builder模式非常相似。

工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。

有人做如下的比较:

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

下面是一个形象的比喻:

无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,这就是我们的new cup();这个cup必须是具体的。

厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。但是很可惜,java并不能new一个抽象的cup,所以就有了简单工厂模式。

原来是cup cup=new cup;现在是******cupfactory.createcup(string cupname),根据cup的名字生产cup,而createcup返回的是一个实现了 cup接口或抽象类的具体cup。简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,只能更改createcup方法,这就不合理了。

我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,干嘛还要更改整条生产线呢?于是就有了工厂模式。原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的模具,现在它不用管了。

cupfactory.createcup()创建cup.cupfactory是接口或抽象类。

实现它的具体子类会创建符合cup接口的具体cup。那么现在厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。