志在指尖
用双手敲打未来

java工厂模式(java三种工厂模式详解)

java工厂模式

工厂方式为创建型方式,在创建方针时,不会向客户端暴露方针的创建逻辑,通过运用一个一起的接口或抽象类来指向新创建的方针。
在日常开发中,工厂方式分为三种:简略工厂方式、工厂方法方式、抽象工厂方式。
二、简略工厂方式
简略工厂方式又称静态工厂方法方式,由一个专门的工厂类来创建具体的实例。作用是将类的实例化与运用者分隔,运用者不需求关怀类是怎样创建的,在必定程度上完结了解耦。
首要人物:
工厂:担任创建所需实例,供应一个供外部运用的方法来获取具体产品。
抽象产品:担任描绘产品的抽象类或接口。
具体产品:我们所需求的具体产品(类实例)
举例:
比如有一汽大众轿车厂(工厂),可以出产不同类型的轿车(抽象产品),比如宝来和速腾(具体产品),这时分可以通过轿车厂来获取想要的具体车型。
抽象产品:
//抽象产品,描绘轿车信息abstractclassCar{abstractStringcarInfo();}
具体产品(宝来):
publicclassBoraextendsCar{@OverrideStringcarInfo(){return”我是宝来轿车”;}}
具体产品(速腾):
publicclassSagitarextendsCar{@OverrideStringcarInfo(){return”我是速腾轿车”;}}
工厂:
publicclassCarFactory{publicstaticCargetCar(StringcarType){switch(carType){case”bora”:returnnewBora();case”sagitar”:returnnewSagitar();default:returnnull;}}}
运用:
publicstaticvoidmain(String[]args){Carcar=CarFactory.getCar(“bora”);}
这样一个简略工厂方式就完结了,简略了解便是说工厂类通过抽象产品类来创建出具体的产品,调用者无需知道具体产品是怎样创建出来的。
利益:类的运用和创建分隔,在必定程度上解耦。
缺点:当需求添加一个产品时,还需求修正工厂类,违背开闭准则。
三、工厂方法方式
工厂方法方式相比上面的简略工厂多了抽象工厂,将产品的创建延迟到抽象工厂的子类(具体工厂)。
首要人物:
抽象工厂:供应创建产品的接口,由子类(具体工厂)来创建具体的产品。
具体工厂:完结抽象工厂的方法,来创建具体产品。
抽象产品:担任描绘产品的抽象类或接口。
具体产品:我们所需求的具体产品(类实例)
举例:
比如有一汽大众轿车厂(抽象工厂),他有两个出产线,宝来出产线(具体工厂)和速腾出产线(具体工厂),通过这两个出产线来出产具体的产品(宝来,速腾)。
抽象产品:
//抽象产品,描绘轿车信息abstractclassCar{abstractvoidcarInfo();}
具体产品(宝来):
publicclassBoraextendsCar{@OverrideStringcarInfo(){return”我是宝来轿车”;}}
具体产品(速腾):
publicclassSagitarextendsCar{@OverrideStringcarInfo(){return”我是速腾轿车”;}}
抽象工厂:
abstractclassCarFactory{abstractCargetCar();}
具体工厂(宝来出产线):
publicclassBoraFactoryextendsCarFactory{//具体工厂继承抽象工厂@OverrideCargetCar(){returnnewBora();}}
具体工厂(速腾出产线):
publicclassSagitarFactoryextendsCarFactory{@OverrideCargetCar(){returnnewSagitar();}}
运用:
publicstaticvoidmain(String[]args){CarFactoryboraFactory=newBoraFactory();//通过具体工厂获取实例Carcar=boraFactory.getCar();}
工厂方法方式比简略工厂方式的利益便是符合开闭准则,假如新增一款产品,只需求创建新的具体工厂即可,缺点是:一个具体工厂只能创建一个具体产品,每添加一款产品都要新增一个类,导致类爆炸。java
四、抽象工厂方式
是一种为访问类供应一个创建一组相关或相互依赖方针的接口,且访问类无须指定所要产品的具体类就能得到同产品不同等级的产品的结构。
抽象工厂方式是工厂方法的晋级版本,工厂方法只能出产同一种等级的产品,而抽象工厂方式可以出产多个等级的产品。
首要人物:
抽象工厂:供应创建产品的接口,包括多个创建产品的方法,可以创建多个不同等级的产品。
具体工厂:完结抽象工厂多个抽象方法,来创建具体产品。
抽象产品:担任描绘产品的抽象类或接口。
具体产品:我们所需求的具体产品(类实例)
举例:
我们有一个总的轿车厂(抽象工厂),通过它出产A级车和B级车。同时还有一汽大众和上汽大众(具体工厂)来创建具体的产品,比如一起大众有A级车宝来,B等级车迈腾,上汽大众有A级车朗逸,B级车帕萨特,所以我们需求如下几个类。
抽象产品:
//A级车抽象类publicclassACar{abstractStringcarInfo();}
//B级车抽象类publicclassBCar{abstractStringcarInfo();}
具体产品:
//一汽大众A级车宝来publicclassBoraextendsACar{@OverrideStringcarInfo(){return”我是A级车一汽大众宝来”;}}
//上汽大众A级车朗逸publicclassLavidaextendsACar{@OverrideStringcarInfo(){return”我是A级车上汽大众朗逸”;}}
//一汽大众B级车迈腾publicclassMagotanextendsBCar{@OverrideStringcarInfo(){return”我是B级车一汽大众迈腾”;}}
//上汽大众B级车迈腾publicclassPassatextendsBCar{@OverrideStringcarInfo(){return”我是B级车上汽大众帕萨特”;}}
抽象工厂:
//车厂publicabstractclassCarFactory{abstractACarcreateACar();abstractBCarcreateBCar();}
具体工厂:
//一汽大众工厂publicclassYiQiFactoryextendsCarFactory{@OverrideACarcreateACar(){returnnewBora();}@OverrideBCarcreateBCar(){returnnewMagotan();}}
//上汽大众工厂publicclassShangQiFactoryextendsCarFactory{@OverrideACarcreateACar(){returnnewLavida();}@OverrideBCarcreateBCar(){returnnewPassat();}}
运用:
比如说我们看车的时分想看一汽大众的A级车或许B级车。
publicstaticvoidmain(String[]args){//获取一汽大众工厂YiQiFactoryyiQiFactory=newYiQiFactory();//获取一汽大众的A级车和B级车ACaraCar=yiQiFactory.createACar();BCarbCar=yiQiFactory.createBCar();}
又比如我想去上汽大众看看。
publicstaticvoidmain(String[]args){//获取上汽大众工厂ShangQiFactoryshangQiFactory=newShangQiFactory();//获取上汽大众的A级车和B级车ACaraCar=shangQiFactory.createACar();BCarbCar=shangQiFactory.createBCar();}
抽象工厂类(车厂)衍生出多个具体工厂(一汽/上汽)。多个抽象产品类(A/B级车),衍生出多个具体产品,宝来朗逸迈腾帕萨特。再通过具体工厂创建多个界别的产品,通过上面的例子我们可以了解为:抽象工厂方式便是创建同一个品牌,不同等级的产品。

java三种工厂模式详解

工厂办法形式分为三种:
1、一般工厂形式,便是建立一个工厂类,对实现了同一接口的一些类进行实例的创立。首要看下关系图:
举例如下:(咱们举一个发送邮件和短信的比如)
首要,创立二者的一起接口:
publicinterfaceSender{publicvoidSend();
}
其次,创立实现类:
publicclassMailSenderimplementsSender{
@Override
publicvoidSend(){
System.out.println(“thisismailsender!”);
}
}
publicclassSmsSenderimplementsSender{
@Override
publicvoidSend(){
System.out.println(“thisissmssender!”);
}
}
最后,建工厂类:
publicclassSendFactory{
publicSenderproduce(Stringtype){
if(“mail”.equals(type)){
returnnewMailSender();
}elseif(“sms”.equals(type)){
returnnewSmsSender();
}else{
System.out.println(“请输入正确的类型!”);
returnnull;
}
}
}
咱们来测验下:
publicclassFactoryTest{
publicstaticvoidmain(String[]args){
SendFactoryfactory=newSendFactory();
Sendersender=factory.produce(“sms”);
sender.Send();
}
}
输出:thisissmssender!
2、多个工厂办法形式,是对一般工厂办法形式的改进,在一般工厂办法形式中,假如传递的字符串出错,则不能正确创立目标,而多个工厂办法形式是提供多个工厂办法,分别创立目标。关系图:
将上面的代码做下修正,改动下SendFactory类就行,如下:
publicSenderproduceMail(){
returnnewMailSender();
}
publicSenderproduceSms(){
returnnewSmsSender();
}
}
测验类如下:
publicclassFactoryTest{
publicstaticvoidmain(String[]args){
SendFactoryfactory=newSendFactory();
Sendersender=factory.produceMail();
sender.Send();
}
}
输出:thisismailsender!
3、静态工厂办法形式,将上面的多个工厂办法形式里的办法置为静态的,不需求创立实例,直接调用即可。
publicclassSendFactory{
publicstaticSenderproduceMail(){
returnnewMailSender();
}
publicstaticSenderproduceSms(){
returnnewSmsSender();
}
}
publicclassFactoryTest{
publicstaticvoidmain(String[]args){
Sendersender=SendFactory.produceMail();
sender.Send();
}
}
输出:thisismailsender!
整体来说,工厂形式合适:凡是呈现了大量的产品需求创立,而且具有一起的接口时,可以通过工厂办法形式进行创立。在以上的三种形式中,第一种假如传入的字符串有误,不能正确创立目标,第三种相对于第二种,不需求实例化工厂类,所以,大多数情况下,咱们会选用第三种——静态工厂办法形式。
4、笼统工厂形式(AbstractFactory)
工厂办法形式有一个问题便是,类的创立依赖工厂类,也便是说,假如想要拓展程序,必须对工厂类进行修正,这违反了闭包原则,所以,从设计视点考虑,有一定的问题,如何解决?就用到笼统工厂形式,创立多个工厂类,这样一旦需求添加新的功用,直接添加新的工厂类就可以了,不需求修正之前的代码。因为笼统工厂不太好了解,咱们先看看图,然后就和代码,就比较简单了解。
请看比如:
publicinterfaceSender{publicvoidSend();
}
两个实现类:
publicclassMailSenderimplementsSender{
@Override
publicvoidSend(){
System.out.println(“thisismailsender!”);
}
}
publicclassSmsSenderimplementsSender{
@Override
publicvoidSend(){
System.out.println(“thisissmssender!”);
}
}
两个工厂类:
publicclassSendMailFactoryimplementsProvider{
@Override
publicSenderproduce(){
returnnewMailSender();
}
}
publicclassSendSmsFactoryimplementsProvider{
@Override
publicSenderproduce(){
returnnewSmsSender();
}
}
仿制代码
在提供一个接口:
publicinterfaceProvider{publicSenderproduce();
}
测验类:
publicclassTest{
publicstaticvoidmain(String[]args){
Providerprovider=newSendMailFactory();
Sendersender=provider.produce();
sender.Send();
}
}

未经允许不得转载:IT技术网站 » java工厂模式(java三种工厂模式详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载