Java实现设计模式之工厂模式
来源:互联网 发布:张艺兴网络剧 编辑:程序博客网 时间:2024/06/04 20:14
工厂模式
工厂模式专门负责实例化有大量公共接口的类,包含以下形式:
1、简单工厂模式(simplefactory)
2、工厂方法(Factorymethod)
3、抽象工厂(AbstractFactory)
1、简单工厂模式(simplefactory):通过多态,工厂实例化合适的对象。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。缺点是:违背了开放-封闭原则。
2、工厂方法(Factory method)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式是简单工厂模式的进一步抽象和推广,既保持了简单工厂模式的优点,而且客服了简单工厂的缺点。但是工厂方法的缺点是:每增加一个产品,就需要增加一个产品工厂的类,增加了额外的开发。(用反射可以解决)
3、抽象工厂(AbstractFactory)提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
1. 抽象工厂的好处:
a) 改变具体工厂即可使用不同的产品配置,使改变一个应用的具体工厂变得很容易。
b) 让具体的创建实例过程与客户端分离,客户端通过抽象接口操作实例,产品的具体类名也被具体工厂的实现分离。
2. 抽象工厂的缺点:如果要新增方法,改动极大。
3. 用简单工厂改进抽象工厂:用DataAccess类来取代具体实施类,可以达到解耦合的目的。但是在DataAccess中增加了更多的Switch,并不明智。
4. 用反射+抽象工厂:优点是去掉了switch,缺点是要更改string字段,重新部署和编译。使用反射+配置文件实现:所有使用简单工厂的地方,都可以考虑使用反射技术来去除switch和if,解除分支判断带来的耦合问题。
Java实现简单工厂模式:
/** * 《大话设计模式》——简单工厂模式 * 应用实例:计算器 * 思想:将加减乘除都封装成子类,在客户端new对应的实例。 */package DaHuaSheJiMoShi;/** * @author LilyLee * @Version 1.0 * @email lilylee_1213@foxmail.com * */public class SimpleFactory {public static void main(String[] args) {OperationFactory oper= new OperationFactory();Operation o=oper.CreateOperate("+");o.setNumA(1);o.setNumB(2);System.out.println(o.GetResult());}public static class OperationFactory{public Operation CreateOperate(String op){Operation oper=null;switch(op){case "+":oper=new OperationAdd();break;case "*":oper =new OperationMul();}return oper;}}} class Operation{private double numA=0;/** * @return the numA */public double getNumA() {return numA;}/** * @param numA the numA to set */public void setNumA(double numA) {this.numA = numA;}/** * @return the numB */public double getNumB() {return numB;}/** * @param numB the numB to set */public void setNumB(double numB) {this.numB = numB;}private double numB=0;public double GetResult(){double result=0;return result;}}class OperationAdd extends Operation{public double GetResult(){double result=0;result=getNumA()+getNumB();return result;}}class OperationMul extends Operation{public double GetResult(){double result=0;result=getNumA()*getNumB();return result;}}
工厂模式方法Java实现:
/** * 《大话设计模式》第八章,雷锋工厂 * * 工厂方法: * 把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。 * 所有的具体类都去实现这个接口。 * 工厂模式就变成了一个工厂抽象接口和多个具体生成对象的工厂。 * * 工厂模式和简单工厂的区别是: * 工厂方法把简单工厂内部逻辑判断移到了客户端来进行。 * 由于工厂方法的多态性,克服了简单工厂的不足,有良好的开放-封闭原则。 * 但是缺点是每增加一个产品,就要额外增加产品工厂类。 */package DaHuaSheJiMoShi;/** * @author LilyLee * @date 2017年6月11日 * @time 下午7:12:47 * @Version 1.0 * @email lilylee_1213@foxmail.com * */public class FactoryMethod {public static void main(String[] args) {// TODO Auto-generated method stubIFactory factory=new student();LeiFeng student=factory.CreateLeiFeng();student.Sweep();student.Wash();IFactory factory2=new Volunteer();LeiFeng volunteer2=factory2.CreateLeiFeng();volunteer2.Sweep();volunteer2.Wash();}}class LeiFeng{public void Sweep(){System.out.println(this.getClass()+"扫地");}public void Wash(){System.out.println(this.getClass()+"清洗");}}interface IFactory{LeiFeng CreateLeiFeng();}class student extends LeiFeng implements IFactory{@Overridepublic LeiFeng CreateLeiFeng() {return new student();}}class Volunteer extends LeiFeng implements IFactory{@Overridepublic LeiFeng CreateLeiFeng() {return new Volunteer();}}
抽象工厂模式,Java实现:
/** * 《大话设计模式》第十五章——抽象工厂模式 * * 抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。 * IFactory是一个抽象工厂接口,它包含所有的产品创建的抽象方法。 * 而ConcreteFactory是具体的工厂。可以有很多。 * * 抽象工厂模式:为了创建不同的产品对象,客户端使用不同的具体工厂。 * * 应用示例:原文的是用.Net写的,比较杂乱,有点儿看不太懂。所以找了一个更好懂的例子。 * 【http://lavasoft.blog.51cto.com/62575/11674/】 * 背景:园丁要在庄园里种植热带和亚热带的水果和蔬菜。 * 园丁是抽象接口,只有种植蔬菜和水果的区别。 * 而水果和蔬菜又分别有热带和亚热带之分。 */package DaHuaSheJiMoShi;/** * @author LilyLee * @date 2017年6月11日 * @time 下午8:10:22 * @Version 1.0 * @email lilylee_1213@foxmail.com * */interface Fruit{}interface Veggie{}interface Gardener{public Fruit createFruit(String name);public Veggie createVeggie(String name);}public class AbstractFactoryTest {public static void main(String[] args) {Fruit f1,f2;Veggie v1,v2;RdGardener rdg=new RdGardener();YRdGardener yrdf=new YRdGardener();f1=rdg.createFruit(" 芒果");f2=yrdf.createFruit(" 荔枝");v1=rdg.createVeggie(" 秋葵");v2=yrdf.createVeggie(" 辣椒");}//热带工厂public static class RdGardener implements Gardener{@Overridepublic Fruit createFruit(String name){return new RdFruit(name);}@Overridepublic Veggie createVeggie(String name) {return new RdVeggie(name);}}//亚热带工厂public static class YRdGardener implements Gardener{@Overridepublic Fruit createFruit(String name){return new YRdFruit(name);}@Overridepublic Veggie createVeggie(String name) {return new YRdVeggie(name);}}//热带水果public static class RdFruit implements Fruit{private String name;/** * @return the name */public String getName() {return name;}/** * @param name the name to set */public void setName(String name) {this.name = name;}public RdFruit(String name){System.out.println("种植热带水果"+name);}}//热带蔬菜public static class RdVeggie implements Veggie{private String name;/** * @return the name */public String getName() {return name;}/** * @param name the name to set */public void setName(String name) {this.name = name;}public RdVeggie(String name){System.out.println("种植热带蔬菜"+name);}}//亚热带水果public static class YRdFruit implements Fruit{private String name;/** * @return the name */public String getName() {return name;}/** * @param name the name to set */public void setName(String name) {this.name = name;}public YRdFruit(String name){System.out.println("种植热带水果"+name);}}//亚热带蔬菜public static class YRdVeggie implements Veggie{private String name;/** * @return the name */public String getName() {return name;}/** * @param name the name to set */public void setName(String name) {this.name = name;}public YRdVeggie(String name){System.out.println("种植热带蔬菜"+name);}}}
- Java实现设计模式之工厂模式
- 设计模式之—工厂方法模式(FactoryMethod)-Java实现
- 设计模式总结之工厂模式-java实现
- Java设计模式之工厂模式(利用反射实现)
- 《大话设计模式》java实现之简单工厂模式
- 《大话设计模式》java实现之工厂方法模式
- 《大话设计模式》java实现之抽象工厂模式
- Java设计模式之工厂设计模式
- [java]设计模式之工厂设计模式
- Java设计模式之工厂设计模式
- Java设计模式之工厂设计模式
- JAVA设计模式之工厂设计模式
- java设计模式之工厂设计模式
- Java设计模式之工厂设计模式
- 《java设计模式》之工厂设计模式
- JAVA设计模式之工厂模式之简单工厂模式
- JAVA设计模式之工厂模式之工厂方法模式
- JAVA设计模式之工厂模式之抽象工厂模式
- 算法与数据结构(2) -- 二叉树深度优先遍历和广度优先遍历
- 服务器(4)--搭建Solr集群+搭建Zookeeper集群(上篇)
- ZCMU—1933
- 深度学习 2 : BP 算法
- USACO3.2.5-butter
- Java实现设计模式之工厂模式
- POJ 1686 Lazy Math Instructor 笔记
- lens shading correction
- 5.31项目随笔
- 的maven pom.xml文件教程详解
- 给初学者的RxJava2.0教程(一)
- Educational Codeforces Round 20
- hdu 2059 龟兔赛跑(DP)
- caffe学习之Lenet-5详解