本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下:
一、 简单工厂
先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建一个B实例,然后调用B实例的方法。这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这种方式也被称为硬编码耦合),一旦系统需要重构:需要使用C类来代替B类时,程序就不得不修改A类代码,如果应用中有100个或者10000个类以硬编码方式耦合了B类,则需要修改100个、10000个地方,这显然是一种非常可怕的事情。
换一个角度来看这个问题:对已A对象而言,它只需要调用B对象的方法,并不关心B对象的实现、创建过程,考虑让B类实现一个IB接口,而A类只需要与IB接口耦合——A类并不直接使用new关键字来创建B实例,而是重新定义一个工厂类:IBFactory,由该工厂类负责创建IB实例,而A类用过调用IBFactory工厂的方法来得到IB的实例。通过以上设计:需要使用C类代替B类,则只需要让C类也实现IB接口,并改写IBFactory工厂中创建IB实例的实现代码,让该工厂产生C实例即可。这种将多个类对象交给工厂类来生成的设计方式叫做简单工厂模式。
以下是简单工厂模式的代码:
/** * 简单工厂模式 * * 需要工厂生产的对象实例所实现的共同的接口 * 发型接口 * @author Administrator * */ public interface Hair { /** * 画发型 */ public void draw(); } /** * 左偏分发型 * @author Administrator * */ public class LeftHair implements Hair { @Override public void draw() { System.out.println("----------------画左偏分发型-----------------"); } } /** * 右偏分发型 * @author Administrator * */ public class RightHair implements Hair { @Override public void draw() { System.out.println("-----------------画右偏分发型------------------"); } } /** * 生产发型的工厂 * 要生产什么发型 只需在这里改就行了 * @author Administrator * */ public class HairFactory { public Hair getHair() { return new LeftHair(); //return new RightHair(); } } /** * 客户端测试类 * @author Administrator * */ public class HairTest { public static void main(String[] args) { HairFactory factory = new HairFactory(); Hair hair = factory.getHair(); hair.draw(); } }
可以看到,如果想把HairTest里面生成的LeftHair改成RightHair,只需修改HairFactory里面getHair方法的实现即可。
使用简单工厂模式的优势在于:让对象的调用者和对象的创建过程分离,当对象调用者需要对象时,直接向工厂请求即可,从而避免了对象的调用者与对象实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。当然,工厂模式也有一个小小的缺陷,当产品修改时,工厂类也要做相应的修改,此处可使用策略模式进行解决,下面是代码。
public interface HairBuilder { /** * 制造发型 * @return */ public Hair getHair(); } public class LeftHairBuilder implements HairBuilder { @Override public Hair getHair() { return new LeftHair(); } } public class RightHairBuilder implements HairBuilder { @Override public Hair getHair() { return new RightHair(); } } public class HairFactory { private HairBuilder hairBuilder; public HairFactory(HairBuilder hairBuilder) { this.hairBuilder = hairBuilder; } public void setHairBuilder(HairBuilder hairBuilder) { this.hairBuilder = hairBuilder; } public Hair getHair() { return hairBuilder.getHair(); } } public class HairTest { public static void main(String[] args) { // HairBuilder builder = new LeftHairBuilder(); HairBuilder builder = new RightHairBuilder(); HairFactory factory = new HairFactory(builder); Hair hair = factory.getHair(); hair.draw(); } }
这种做法的好处是无需再去修改工厂类,将工厂里面的创建对量逻辑根据不同的策略抽象出来,程序需要创建什么对象,只需网工厂中传入相应的builder即可。
二、工厂方法
在简单工厂模式中,系统使用工厂类生产所有产品实例,且该工厂类决定生产哪个类的实例,即工厂类负责所有的逻辑判断、实例创建等工作。
如果不想再工厂类中进行逻辑判断,程序可以为不同的产品类提供不同的工厂,不同的工厂类生产不同的产品,无需再工厂类中进行复杂的逻辑判断。这就有点类似于上面的简单工厂模式结合策略模式,不同的是前者只有一个工厂,后者需要有多个工厂。下面是工厂方法模式的代码。
/** * 工厂方法模式 * 需要工厂生产的对象实例所实现的共同的接口 * @author Administrator * */ public interface Person { public void drawPerson(); } public class Man implements Person { @Override public void drawPerson() { System.out.println("---------------------draw a man--------------------"); } } public class Women implements Person { @Override public void drawPerson() { System.out.println("--------------------draw a women---------------------"); } } /** * 生产人的工厂 * @author Administrator * */ public interface PersonFactory { //生产人 public Person getPerson(); } /** * 生产man的工厂 * @author Administrator * */ public class ManFactory implements PersonFactory { @Override public Person getPerson() { return new Man(); } } /** * 声场women的工厂 * @author Administrator * */ public class WomenFactory implements PersonFactory { @Override public Person getPerson() { return new Women(); } } /** * 客户端测试类 * @author Administrator * */ public class PersonTest { public static void main(String[] args) { // PersonFactory factory = new ManFactory(); PersonFactory factory = new WomenFactory(); Person person = factory.getPerson(); person.drawPerson(); } }
这种的典型的特点就是在客户端代码中根据不同的工厂生产其对应的产品,不必把复杂的逻辑都放在工厂类里面判断。这种实现有一个很明显的缺陷,就是客户端与工厂类进行了耦合。
三、抽象工厂
采用上面的工厂方法的设计架构,客户端代码成功与被调用对象的实现类分离,但带来了另一种耦合:客户端代码与不同的工厂类耦合。为了解决这种耦合的问题,考虑在增加一个工厂类,用来生成工厂实例,实现生产产品的工厂与客户端分离,这种设计方式被称为抽象工厂模式。下面是抽象工厂模式的代码
/** * 抽象工厂模式 * 生产PersonFactory的工厂 * @author Administrator * */ public class PersonFactoryFactory { public static PersonFactory getPersonFactory(String type) { if(type.equalsIgnoreCase("man")) { return new ManFactory(); } else { return new WomenFactory(); } } } /** * 客户端测试类 * @author Administrator * */ public class PersonTest { public static void main(String[] args) { PersonFactory factory = PersonFactoryFactory.getPersonFactory("man"); Person person = factory.getPerson(); person.drawPerson(); } }
更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null
本文向大家介绍PHP设计模式之简单工厂和工厂模式实例分析,包括了PHP设计模式之简单工厂和工厂模式实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP设计模式之简单工厂和工厂模式。分享给大家供大家参考,具体如下: 工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮
4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 cr
本文向大家介绍java设计模式之简单工厂模式,包括了java设计模式之简单工厂模式的使用技巧和注意事项,需要的朋友参考一下 在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装);如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetResult()虚函数,这时添加新的运算只需要派生一个新的类,即不需要之前的运算参
我正在学习新的设计模式 我编写了一个简单的工厂类,如下所示 我们创建Factory类,如下所示: 现在,当客户端想要添加名为IceCream的新项目时,他们只需创建名为IceCreamFactory的新工厂并从中创建IceCream,如下所示: 我的理解正确吗?我们在这里满足了开闭原则,但对于每个产品(项目),我们都需要一个工厂类,这不是一个可管理的噩梦吗? 注:我指的是一篇文章https://w
本文向大家介绍Java设计模式编程中的工厂方法模式和抽象工厂模式,包括了Java设计模式编程中的工厂方法模式和抽象工厂模式的使用技巧和注意事项,需要的朋友参考一下 工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展。 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来