为什么要用工厂模式

本文介绍了工厂模式的概念及其在软件开发中的应用。通过实例演示了如何利用工厂模式创建对象,并讨论了其带来的灵活性和可扩展性优势。

工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A(). 工厂模式也是用来创建实例对象的,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

类Sample为例,要创建Sample的实例对象:

Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等

首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:

Sample sample=new Sample(参数);


 但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了

初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装 ”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。

你想如果有多个类似的类,我们就需要实例化出来多个类。这样代码管理起来就太复杂了。
这个时候你就可以采用工厂方法来封装这个问题。
不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample

Sample mysample=new MySample();
Sample hissample=new HisSample();


采用工厂封装:

public class Factory{

  public static Sample creator(int which){

  //getClass 产生Sample 一般可使用动态类装载装入类。
  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}


那么在你的程序中,如果要实例化Sample时.就使用

Sample sampleA=Factory.creator(1);


举个更实际的例子,比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等,那么连接数据库的代码是不一样的,你用传统的方法,就不得不进行代码修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候代码就不用进行修改了。

我通常都是用xml的配置文件配置许多类型的数据库连接,非常的方便。PS:工厂模式在这方面的使用较多。

工厂设计模式在软件工程中具有重要的作用,主要体现在它能够提高代码的可维护性、可扩展性和灵活性。这种设计模式通过定义一个接口来创建对象,让子决定实例化哪一个,从而实现了对象创建和使用的分离。这种方式在实际开发中被广泛应用,特别是在需要灵活创建和管理对象的场景中。以下是工厂设计模式的具体作用和学习意义: 1. **提高代码的可维护性**:通过工厂模式,可以将对象的创建逻辑集中在一个地方,这样当需要修改或扩展对象创建逻辑时,只需修改工厂,而不必改动使用这些对象的客户端代码。这有助于减少代码的耦合度,使得代码更容易维护。 2. **提高代码的可扩展性**:工厂模式允许通过添加新的具体产品和相应的工厂来轻松扩展系统功能,而无需修改现有的代码。这种开闭原则的应用使得系统更加灵活,能够适应未来的需求变化。 3. **提高代码的灵活性**:工厂模式通过将对象的创建与使用分离,使得客户端代码可以独立于具体的实例化过程。这种解耦使得客户端代码更加通用,可以更容易地适应不同的产品配置。 4. **促进代码的复用**:工厂模式通过提供一个统一的接口来创建对象,使得不同的客户端可以使用相同的接口来获取和使用对象,从而促进了代码的复用。 5. **支持依赖注入**:工厂模式在Spring框架中得到了广泛的应用,特别是在其核心的控制反转(IoC)容器中。通过工厂模式,可以方便地实现依赖注入,进一步提高代码的灵活性和可测试性。 6. **简化复杂对象的创建**:对于复杂的对象创建过程,工厂模式可以通过封装这些过程,使得客户端代码无需关心具体的创建细节,只需通过简单的接口调用即可获取所需的对象。 7. **增强系统的模块化**:工厂模式通过将对象的创建逻辑集中在一个模块中,增强了系统的模块化程度,使得系统结构更加清晰,便于理解和维护。 ### 工厂设计模式的实现 #### 简单工厂模式 简单工厂模式是最基本的工厂模式,它通过一个工厂来负责创建所有产品的实例。这种方式虽然简单,但在产品种较多时可能会导致工厂过于臃肿。 ```java // 简单工厂模式 interface Product { void show(); } class ConcreteProduct1 implements Product { @Override public void show() { System.out.println("这是产品1"); } } class ConcreteProduct2 implements Product { @Override public void show() { System.out.println("这是产品2"); } } class SimpleFactory { public static Product createProduct(String type) { if ("product1".equals(type)) { return new ConcreteProduct1(); } else if ("product2".equals(type)) { return new ConcreteProduct2(); } else { throw new IllegalArgumentException("无法识别的产品型"); } } } // 使用 public class Main { public static void main(String[] args) { Product product1 = SimpleFactory.createProduct("product1"); product1.show(); Product product2 = SimpleFactory.createProduct("product2"); product2.show(); } } ``` #### 工厂方法模式 工厂方法模式工厂提取成一个接口或抽象,具体生产什么产品由子决定。这种方式通过定义一个工厂接口,使得每个具体工厂负责创建一个具体产品的实例。 ```java // 工厂方法模式 interface FruitFactory2 { Fruit createFruit(); // 生产水果 } class AppleFactory implements FruitFactory2 { @Override public Fruit createFruit() { return new Apple(); } } class OrangeFactory implements FruitFactory2 { @Override public Fruit createFruit() { return new Orange(); } } interface Fruit { void eat(); } class Apple implements Fruit { @Override public void eat() { System.out.println("吃苹果"); } } class Orange implements Fruit { @Override public void eat() { System.out.println("吃橘子"); } } // 使用 public class Main { public static void main(String[] args) { FruitFactory2 factory = new AppleFactory(); Fruit fruit = factory.createFruit(); fruit.eat(); } } ``` ### 工厂设计模式的应用场景 1. **需要灵活创建和管理对象的场景**:工厂模式适用于需要根据不同的条件创建不同对象的场景,通过工厂可以集中管理对象的创建逻辑。 2. **需要提高代码可维护性和可扩展性的场景**:当系统需要频繁地添加或修改对象时,工厂模式可以通过扩展工厂来实现,而不必修改现有的代码。 3. **需要支持依赖注入的场景**:工厂模式在Spring框架中得到了广泛的应用,特别是在其核心的控制反转(IoC)容器中,通过工厂模式可以方便地实现依赖注入。 4. **需要简化复杂对象创建的场景**:对于复杂的对象创建过程,工厂模式可以通过封装这些过程,使得客户端代码无需关心具体的创建细节。 5. **需要增强系统模块化的场景**:工厂模式通过将对象的创建逻辑集中在一个模块中,增强了系统的模块化程度,使得系统结构更加清晰,便于理解和维护。 通过学习和应用工厂设计模式,开发者可以更好地理解和实践面向对象设计原则,提高代码的质量和系统的可维护性。[^1] [^2] [^3] [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值