java哪些地⽅⽤到了⼯⼚模式_【java】实际开发中哪些场景需
要⽤到⼯⼚模式?...
⼯⼚⽅法模式可以允许系统在不修改⼯⼚⾓⾊的情况下引进新产品。
⼯⼚模式
简单⼯⼚模式
抽象⼯⼚模式
请问实际开发中哪些情况下会⽤到它?为什么我感觉我现在开发很少会⽤到这些设计模式啊。。。
回答
我先说下 我⽬前看到⽤到了⼯⼚模式的例⼦:
⼀般的MVC框架中,都有⼀个基本的DB数据库基本操作类
我叫它DB class,有⼀个baseModel class 去继承 db class
baseModel 是所有框架model的基类,需要继承baseModel
baseModel已经有db类的 增删查改的⽅法了,baseModel其实就是数据库⼯⼚,不同的模型继承baseModel,就有操作不同数据表的对象实例了,这样就⽤⼀个基础的class 完成了实例化各个不同数据表的对象,就好像是⼯⼚⼀样,传不同的表名字就返回给你不同的对象。
我的理解就是这样的,如有误,还请包涵和斧正。
不论是⼯⼚模式还是其它创建型模式,都是⼀个⽬的——为了初始化⼀个对象。或者说,为了构建⼀个数据结构模型(类和对象本⾝就是⼀种⾃定义的数据结构)。
那么,问题来了,为什么有 new 这样⽅式可以创建⼀个对象,还要使⽤设计模式。本质上就是⼀个原因,不想让上层使⽤者直接使⽤ new 来初始化对象。
这样的原因有很多,绝⼤多数原因就是对上层的使⽤者隔离对象创建的过程;或者是对象创建的过程复杂,使⽤者不容易掌握;或者是对象创建要满⾜某种条件,这些条件是业务的需求也好,是系统约束也好,没有必要让上层使⽤者掌握,增加别⼈开发的难度。
所以,到这时我们应该清楚了,⽆论是⼯⼚模式,还是上⾯的战友说的开闭原则,都是为了隔离⼀些复杂的过程,使得这些复杂的过程不向外暴露,如果暴露了这些过程,会对使⽤者增加⿇烦,这也就是所
谓的团队合作。
⾯向对象封装的本⾝也就是为了使得对外的 API 尽可能的简化。
例如,你定义了⼀个 Status字段,但这个字段因为某些业务原因,需要使⽤整数来表⽰状态。那么,如果数字少了还好办,如果数字多了,上层使⽤者就不⼀定能记清楚每个数字代表的状态(⽐如你要做语⾳通信系统,那么,语⾳设备是有很多状态数字的)。这时,如果使⽤new来创建对象,然后再对 Status 进⾏赋值,不可避免的,可能要查阅开发⽂档,或者会不⼩⼼给出⼀个错误的值。这时,你就不妨使⽤⼯⼚模式,或者其它合适的设计模式,来进⾏代码的建设。
⽐如,这样:
public static class Factory
{
public static Ixxxxxx CreateWithOpen()
{
var obj = new Obj();
obj.Status = 1;
return obj;
}
public static Ixxxxxx CreateWithClose()
{
var obj = new Obj();
obj.Status = 2;
return obj;
}
}
当然,使⽤枚举也⾏,这个说⽩了,就是看设计者的意愿了。
所以,设计模式没有说必需在哪个场景中使⽤,更确切的说,应该是,当你使⽤了设计模式,能不能为你的团队成员带来⽅便,或者提升代码质量,避免⼀些错误。如果是,就⽤,如果仅仅带来了复杂,并没有益处,那还是算了。
⼀句话,没有该不该⽤,也没有哪些需要不需要⽤,⽤就要带来效益,⽆论是对团队还是产品质量或产品的可维护性。⽤不⽤,要以团队配合和产品为导向,这才是对⼀个软件设计师的基本要求。
想理解⼯⼚模式的话就不能不知道简单⼯⼚模式了。
switch ($type) {
case '存款职员': $man = new Depositer;
break;
case '销售': $man = new Marketer;
break;
case '接待': $man = new Receiver;
break;
default: echo '传输参数有误,不属于任何⼀个职位';
break;
}
诺,这就是简单⼯⼚模式,是不是很常见,简单⼯⼚模式有⼀个不⾜,他虽然遵循了单⼀职责原则,但它违反了另⼀条很重要的原则:开放封闭原则。如果新增⼀个⽂员职位,那么我们还要修改对应代码,增加⼀个case,这是很可怕的,因为写好的代码如果我们再去修改可能会造成未知的效果。
⽽⼯⼚模式就是对简单⼯⼚的⼀次升级,这⾥以MVC⾥的DB class来说明,外部调⽤的时候只需选择⾃⼰所需的表名,该⼯⼚会去调⽤真实数据库处理⽅法,然后返回你想要的结果。
java中常用的设计模式有哪些⼯⼚模式是⼀个⽤于实例化对象的模式,是⽤⼯⼚⽅法代替new操作的⼀种⽅式。⼯⼚模式在Java项⽬中到处都是,因为⼯⼚模式就相当于创建实例对象的new,如在我们的系统中经常需要记⽇志,如果创建logger实例时所做的初始化⼯作可能是很长⼀段代码,可能要初始化、赋值、查询数据等等,则会导致代码臃肿⽽难看。
private static Logger logger = Logger(MyBusinessRPC.class);
public static Logger getLogger(String name) {
ILoggerFactory iLoggerFactory = getILoggerFactory();
Logger(name);
}
public static ILoggerFactory getILoggerFactory() {
if (INITIALIZATION_STATE == UNINITIALIZED) {
INITIALIZATION_STATE = ONGOING_INITIALIZATION;
performInitialization();
}
switch (INITIALIZATION_STATE) {
case SUCCESSFUL_INITIALIZATION:
Singleton().getLoggerFactory();
case NOP_FALLBACK_INITIALIZATION:
return NOP_FALLBACK_FACTORY;
case FAILED_INITIALIZATION:
throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);
case ONGOING_INITIALIZATION:
// support re-entrant behavior.
return TEMP_FACTORY;
}
throw new IllegalStateException("Unreachable code");
}
在java web项⽬开发过程中,经常会看到如下配置⽂件:
bean的name属性sqlSessionFactory,我们知道Sqlsession对应着⼀次数据库会话。由于数据库回话不是永久的,因此Sqlsession的⽣命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession⾥只能执⾏⼀次sql,你可以执⾏多次,当⼀旦关闭了Sqlsession就需要重新创建它)。创建Sqlsession的地⽅只有⼀个,那就是SqlsessionFactory的openSession⽅法,这⾥也⽤到了⼯⼚模式。
设计模式的根本⽬的是减少项⽬变化所造成的影响,这⼀点要牢牢记住!
⼯⼚模式是把项⽬当中的变化点抽取封装出来.⾄于哪些是变化点,哪些该抽象需要开发者⾃⾏观察和预测.
举个不恰当的例⼦
⽐如我的⽹站有多个页⾯每个页⾯都有css⽂件
//样式路径获取⼯⼚类
public class MyStyleFactory
{
public string Page1Css(){return cssPath;}
public string Page2Css(){return cssPath;}
//.......
}
假设项⽬中html的link链接就是通过代码⽣成的.
那么显然每个页⾯都会要求获得css的路径.
且css路径也是⾮常有可能变化的,那么这就是变化点,于是我可以把获取路径的这些变化点封装到MyStyleFactory中.这样以后修改只要改MyStyleFactory,⽽不是切换到各个页⾯修改.
这就是简单⼯⼚.
但是⼀个⽹站可能有多种主题的样式,⽽MyStyleFactory仅能获取⼀个主题的样式,如果我想切换样式呢?
于是切换样式就成了变化点,因封装他.换句话说我的系统是会切换Factory的.
为了适应Factory的切换,使⽤Factory的地⽅应该依赖于抽象,于是要有个抽象的⼯⼚.
abstract class AbstractFactory
{
public abstract string Page1Css();
public abstract string Page2Css();
//.......
}
写多个实现AbstractFactory的样式⼯⼚
在使⽤的时候
Client(){
AbstractFactory factory=new MyStyleFactory();
}
你会发现只有⼀个地⽅要变化
这就是抽象⼯⼚
上⾯说到这个例⼦是不恰当的.如果页⾯数量确定下来还好说,但实际项⽬中变化的不仅仅是页⾯的样式(变化页⾯主题),页⾯的数量也是变化的,于是AbstractFactory中的Page数字Css⽅法的数量是不确定的,每添加⼀个页⾯就要加⼀个⽅法,并且每个继承类都要修改,这种变化⽤抽象⼯⼚是不适合的,所以这时候使⽤抽象⼯⼚反⽽是错的.
所以⼀定要弄清楚项⽬需求以及设计模式的应⽤场景
⼯⼚的职能就是你给它⼀个模型或者具体的样品需求,它给你⼀个成品。⼯⼚模式也是这样的道理,⽐如,你⼊参是a,它就给你⼀个A对象,你⼊参b,它就给你⽣产⼀个B对象,这⾥a,b就是你让⼯⼚⽣产的商品具体需求,如长宽⾼等。
⼯⼚你可以理解为隐藏了内部细节,你调⽤⼯⼚的⽣产API ,直接获得所描述的物体,具体怎么⽣产的,
你不⽤去关注细节,因为有的东西简单,直接new出来就可以了,但有的很复杂,⽐如spring的注⼊链。要理解⼯⼚模式,建议看看spring实现的factory。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。