工厂设计模式
❶ java什么是工厂设计模式
把创建对象的工作,交给一个抽象出来的概念'工厂'去做,就是工厂设计模版式。比如,你要新建一个用权户对象 User user=new User();这很简单,也好理解。但是如果你用工厂设计模式去做,就算最简单的实现你也得加个类型,如:UserFactory,而里面的代码可能只是:
public static User getUser(){
return new User();
}
在使用的时候就是变成:User user = UserFactory.getUser();
嗯,看起来是多此一举,没错,我这场景就是多此一举。工厂模式适用场景,首先得有较复杂的子父类结构,再者创建逻辑可能很复杂,这样才有意义,才有必要去使用工厂模式。又或者这个傻逼对象创建起来很消耗性能,且不是非得是全新的才能用,那么可以配合单例模式一起使用,实现对象的复用,达到性能优化的目的。
嗯,你可能又会疑惑,啥是单例,给你个很傻的描述:有个神奇的类,他有个神奇的方法,这个方法会帮你创建一个对象,且不管调用几次,怎么调用,他都保证只给你一个,且百分百是同一个。
❷ Java中常用的设计模式有哪些请详细说明一下工厂模式。
1.单例模式(有的书上说叫单态模式其实都一样)
该模式主要目的是使内存中保持1个对象
2.工厂模式
该模式主要功能是统一提供实例对象的引用。看下面的例子:
public class Factory{
public ClassesDao getClassesDao(){
ClassesDao cd = new ClassesDaoImpl();
return cd;
}
}
interface ClassesDao{
public String getClassesName();
}
class ClassesDaoImpl implements ClassesDao {
public String getClassesName(){
System.out.println("A班");
}
}
class test
{
public static void main(String[] args){
Factory f = new Factory();
f.getClassesDao().getClassesName();
}
}
这个是最简单的例子了,就是通过工厂方法通过接口获取对象的引用
3.建造模式
该模式其实就是说,一个对象的组成可能有很多其他的对象一起组成的,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些对象的引用又包括很多的对象引用。封装这些复杂性,就可以使用建造模式。
4.门面模式
这个模式个人感觉像是Service层的一个翻版。比如Dao我们定义了很多持久化方法,我们通过Service层将Dao的原子方法组成业务逻辑,再通过方法向上层提供服务。门面模式道理其实是一样的。
5.策略模式
这个模式是将行为的抽象,即当有几个类有相似的方法,将其中通用的部分都提取出来,从而使扩展更容易。
❸ java 工厂设计模式有什么好处 回到最好能通俗一点
如果用工厂模式,你只需要修改工厂代码。其他地方引用工厂,可以做到只修改一个地方,其他代码都不动,就是解耦了,也就是降低了代码的耦合性
❹ 什么是PHP中的工厂设计模式
工厂模式分为三种:简单工厂、工厂方法、抽象工厂 ,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。
❺ 工厂设计模式的作用是什么
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况, 新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
问题
你如何能轻松方便地建立这么" 复杂 " 的对象即操作中不需要粘贴复制呢?
解决方法
建立一个工厂(一个函数或一个类方法)来制造新的对象。为了理解工厂的用处, 试想以下的不同之处……
下载php设计模式.chm
❻ Java,设计模式,简单工厂。
这个问题很简单啊,就是一个接口,N个具体类,然后创建一个抽象工厂根据传入的类名生成不同的处理类。首先看看工程结构图:
Common接口:
packagepkg1.pkg2;
/**
*Common计算接口
*
*@author
*
*/
publicinterfaceCommon{
//接口方法返回结算结果
publiclongcalulate(inta,intb,intc);
}
packagepkg1;
importpkg1.pkg2.Common;
/**
*Car007具体实现
*
*@author
*
*/
{
publiclongcalulate(inta,intb,intc){
returna*b/c;
}
}
packagepkg1;
importpkg1.pkg2.Common;
/**
*Plane具体实现
*
*@author
*
*/
{
publiclongcalulate(inta,intb,intc){
returna+b+c;
}
}
importpkg1.pkg2.Common;
/**
*主程序应用方法
*
*@author
*
*/
publicclassComputeTime{
/**
*获得Common对象
*
*@paramclazz
*@return
*/
(Stringclazz){
Commoncommon=null;
//生成接口对象
try{
common=(Common)Class.forName("pkg1."+clazz).newInstance();
}
catch(InstantiationExceptione){
e.printStackTrace();
}
catch(IllegalAccessExceptione){
e.printStackTrace();
}
catch(ClassNotFoundExceptione){
e.printStackTrace();
}
returncommon;
}
/**
*计算运行distance所需要的时间
*
*@paramdistance
*距离
*@paramcommon
*计算速度的接口对象
*@parama
*@paramb
*@paramc
*@return
*/
publicstaticdoublecalulate(longdistance,Commoncommon,inta,intb,intc){
if(common!=null){returndistance/common.calulate(a,b,c);}
return0;
}
/**
*主程序方法
*
*@paramargs
*/
publicstaticvoidmain(String[]args){
if(args==null||args.length<4){
System.out.println("参数个数不正确!正确格式:javaComputeTimeXXABC");
return;
}
//获得a
inta=Integer.parseInt(args[1]);
//获得b
intb=Integer.parseInt(args[2]);
//获得c
intc=Integer.parseInt(args[3]);
//计算1000公里的时间
System.out.println(args[0]+"运行1000公里所需的时间为:"+calulate(1000,getCommonObject(args[0]),a,b,c)+"小时");
}
}
最后程序运行结果:
MicrosoftWindowsXP[版本5.1.2600]
(C)版权所有1985-2001MicrosoftCorp.
E:>cdE:workspace estin
E:workspace estin>javaComputeTimePlane203040
Plane运行1000公里所需的时间为:11.0小时
E:workspace estin>javaComputeTimeCar007233445
Car007运行1000公里所需的时间为:58.0小时
E:workspace estin>
❼ java 设计模式(工厂方法)
面向抽象(抽象类或接口)编程。
IWorkFactory studentWorkFactory = new StudentWorkFactory(); 注意:类型是接口类型,即抽象工厂,抽象工厂生产的是抽象产品,而new的则是具体工厂,是由子类实现的,具体工厂生产具体产品。面向抽象的好处:1.在设计抽象的时候不用管具体的实现,只要定义接口知道它用来干什么就行,这样,我只需要知道抽象接口就能继续下面的开发设计工作了,而不用事先设计具体的实现内容;2. 可以扩展多个子类实现抽象接口,更利于系统后期的扩展,而对原系统不造成任何影响,即:开-闭原则。
TeacherWork tt = new TeacherWork(); 不用说就是面向具体实现类编程,缺点就是扩展性不好,对系统后期维护扩展影响较大。
举个简单的例子:
假如在系统的A.java中代码中使用了TeacherWork 类型对象,是满足了目前软件的需求,但是,如果有一天需求变化了需要一个StudentWork 类型对象,该怎么办?只能修改A.java类来满足这样的修改需求。这样就影响了原来系统结构稳定性,需要重新调试和测试,而这带来的维护成本是非常大的,有时可能还会带来系统错误,而影响系统运行。
如果在A.java类中应用Work接口类型就不会存在这种问题,A.java不需要任何修改,只需要修改注入到A中的Work接口的具体实现类即可。
面向抽象编程的好处就在于对系统维护和扩展上,即在不影响原系统稳定运行的基础上增加新的扩展行为,即要符合“开-闭”原则。可能会因此而失去一定的效率问题,但是对于后期的维护成本来说,这个可以忽略不计。 推荐你一本好书:《软件秘笈-设计模式那点事》其中讲解的设计模式很到位,还有每个模式的静态类图和JDK中设计模式的具体分析讲解,读了收获一定很大。祝你成功!
❽ mvc模式和工厂设计模式是同一层次上的概念
简单工厂模式(Simple Factory Pattern),又称静态工厂模式(Static Factory Pattern)。举两个例子以快速明白Java中的简单工厂模式:
女娲抟土造人
话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。
女娲造人,这就是简单工厂模式的应用。
首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。
1.)女娲是一个工厂类,也就是简单工厂模式的核心角色。
2.)具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色
3.)抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(特征或者功能)
注意:女娲与张三,李四属于创建依赖关系,上图箭头应该是虚线(实现代表关联关系)。而张三,李四与人属于实现关系,上图三角形头的箭头也应该是虚线(实线代表继承关系)。
理解了上面的这些东西,再来理解下面的例子,对照理解,相信看完这篇文章,便对java简单工厂模式有一个很好的理解:
有一个农场公司,专门向市场销售各类水果,在这个系统里需要描述下列水果:
葡萄Grape
草莓Strawberry
苹果Apple
水果与其他植物不同,最终可以采摘食用,那么一个自然的做法是建立一个各种水果都适用的接口,以便与其他农场里的植物区分开来,
此时,则是为水果类声明了一个接口,表现在代码上:
public interface Fruit
{
//种植
public void plant();
//生长
public void grow();
//收获
public void harvest();
}
水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法plant(),grow(),和harvest();
Apple类是水果类的一种,因此它实现了水果接口所声明的所有方法。另处,由于苹果是多年生植物,因此多出一个treeAge性质,描述苹果的树龄。代码如下所示:
/**
*
* 类名称:Apple
* 类描述:农场苹果类
*
*/
public class Apple implements Fruit
{
/**
* 苹果为多年生植物
*/
private int treeAge;
/* (non-Javadoc)
* @see fac.Fruit#grow()
*/
@Override
public void grow()
{
System.out.println("苹果开始生长。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#harvest()
*/
@Override
public void harvest()
{
System.out.println("苹果开始收获。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#plant()
*/
@Override
public void plant()
{
System.out.println("苹果种入农场。。。");
}
public int getTreeAge()
{
return treeAge;
}
public void setTreeAge(int treeAge)
{
this.treeAge = treeAge;
}
}
同理,葡萄Grape:
public class Grape implements Fruit
{
/**
* 葡萄分为有籽无籽
*/
private boolean seedless;
/* (non-Javadoc)
* @see fac.Fruit#grow()
*/
@Override
public void grow()
{
System.out.println("葡萄开始生长。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#harvest()
*/
@Override
public void harvest()
{
System.out.println("葡萄开始收获。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#plant()
*/
@Override
public void plant()
{
System.out.println("葡萄种入农场。。。");
}
public boolean isSeedless()
{
return seedless;
}
public void setSeedless(boolean seedless)
{
this.seedless = seedless;
}
}
草莓Stuawberry:
public class Strawberry implements Fruit
{
/* (non-Javadoc)
* @see fac.Fruit#grow()
*/
@Override
public void grow()
{
System.out.println("草莓开始生长。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#harvest()
*/
@Override
public void harvest()
{
System.out.println("草莓开始收获。。。");
}
/* (non-Javadoc)
* @see fac.Fruit#plant()
*/
@Override
public void plant()
{
System.out.println("草莓种入农场。。。");
}
}
农场园丁也是系统的一部分,由一个类来代表,FruitGardener类,代码如下:
public class FruitGardener
{
public static Fruit factory(String which) throws Exception
{
if(which.equalsIgnoreCase("apple"))
{
return new Apple();
}
else if(which.equalsIgnoreCase("grape"))
{
return new Grape();
}
else if(which.equalsIgnoreCase("strawberry"))
{
return new Strawberry();
}
else
{
throw new Exception("抱歉,本农场不生产此种水果");
}
}
}
这下,农场一片繁荣景象了。来年一定是个丰收年。
这时有客户来果园查看情况,和园丁说,给我们介绍下你的水果吧。于是园丁:
类描述:来农场订购水果,看水果情况的客户
public class Client
{
public static void main(String[] args) throws Exception
{
FruitGardener fruitGardener = new FruitGardener();
Fruit apple = fruitGardener.factory("apple");
apple.grow();
Fruit strawBerry = fruitGardener.factory("strawberry");
strawBerry.harvest();
Fruit ddd = fruitGardener.factory("ddd");
ddd.plant();
}
}
❾ 设计模式(二):简单工厂,工厂和抽象工厂的区别
首先来看看这两者的定义区别:工厂模式:定义一个用于创建对象的借口,让内子类决定实例化容哪一个类抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。再来看看工厂方法模式与抽象工厂模式对比:
❿ 设计模式简单工厂模式
工厂是指生产实例的地方。那就简单一个,直接命名为createInstance()。此方法通常是静态的,而且回还会带有答参数和返回值。举个例子:例如牛、羊、马、狗都继承动物类,那createInstance()的返回值应该为 动物(因为工厂就是生产动物的嘛,所以返回值也应该为动物),参数应该为动物名称(这样工厂根据名称才知道你要生产哪种动物啊)。这样就可以根据传入的的动物名称,产生一个动物实例。createInstance的实现:switch(动物名称) case 牛:return new 牛();case 羊:return new 羊();case 马:return new 马();case 狗:return new 狗();