首页 > 经验记录 > java设计模式_工厂模式

java设计模式_工厂模式

工厂模式

 
工厂模式主要是实现了创建和调用者的分离
 
核心本质:

  • 实例化对象,用工厂方法代替new操作
  • 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

 
工厂模式(factory)大概分为三种:

  • 简单工厂模式:
    • 用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
  • 工厂方法模式
    • 用来生产同一等级结构中的固定产品(支持增加任意产品)
  • 抽象工厂模式
    • 用来生产不用产品族的全部产品(对于增加新的产品无能为力;支持增加产品族)

 
简单工厂

  • 简单工厂也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数不同来返回不同的对象实例
  • 缺点是对于增加新产品无能为力,不修改代码就不能扩展,必须修改已有的代码。

例如:
有这么几个东西,一个Car接口,还有实现了Car接口的宝马和奥迪类

package com.yibobo.factory;
public interface Car {
    void run();
}
package com.yibobo.factory;
public class Audi implements Car{
    @Override
    public void run() {
        System.out.println("奥迪在跑");
    }
}
package com.yibobo.factory;
public class BMW implements Car {
    @Override
    public void run() {
        System.out.println("宝马在跑");
    }
}

 
此时,传统的new操作是这样的

package com.yibobo.factory;
public class TestCar {
    public static void main(String[] args) {
        Car c1 = new Audi();
        Car c2 = new BMW();
        c1.run();
        c2.run();
    }
}

 
这样,我这个TestCar需要知道:Car类、Audi类、BMW类
那以后要是这Car有一百个实现类呢= =这个时候,我要是想要new一个Car的实现类出来,但又不想要和这一堆复杂的构造逻辑耦合,怎么办?使用工厂模式嘛
工厂类最大好处让是使用者和对象的创建分离。使用者再也不担心,对象是怎么创建的。用上接口,使用者更不需要知道对象是谁。
我只要这样创建出一个工厂类(我这用的是IF…ELSE,用switch啥的都行):

package com.yibobo.factory;
public class CarFactory {
    public static Car creatCar(String str){
        if (str.equals("奥迪")){
            return new Audi();
        }else if (str.equals("宝马")){
            return new BMW();
        }else{
            return null;
        }
    }
}

 
这一切就解决了
创建Car实现类的时候只需要这样:

package com.yibobo.factory;
public class TestCar {
    public static void main(String[] args) {
        Car c1 = CarFactory.creatCar("奥迪");
        Car c2 = CarFactory.creatCar("宝马");
        c1.run();
        c2.run();
    }
}

 
这里与我调用者有关系的只有Car接口、CarFacory工厂类、以后就是有一万个不同的实现类也和我调用者没半毛钱关系
这样就隐藏了实现类的细节,调用者也不需要知道这个对象是咋创建的
你需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
我就一买家,只要这车开的动就行了。我还自个造个车子?
 
这就是简单工厂了。也是用的最多的工厂
 
工厂方法模式

  • 为了避免简单工厂模式的缺点、不完全满足OCP
  • 工厂方法模式和简单工厂模式最大的不同在于,简单工程模式只有一个工厂类(对于一个项目或一个独立模块而言),而工厂方法模式有一组实现了相同接口的工厂类

工厂类大概这样:

package com.yibobo.factorymethod;
public interface CarFactory {
    Car createCar();
}

 
在这个抽象的工厂类基础上,可以添加无数个具体的创建某个产品的实现类
比如:

package com.yibobo.factorymethod;
public class createAudi implements CarFactory{
    @Override
    public Car createCar() {
        return new Audi();
    }
}
package com.yibobo.factorymethod;
public class createBMW implements CarFactory{
    @Override
    public Car createCar() {
        return new BMW();
    }
}

 
创建对象的话就这样:

package com.yibobo.factorymethod;
public class TestCar {
    public static void main(String[] args) {
        Car c1 = new createAudi().createCar();
        Car c2 = new createBMW().createCar();
        c1.run();
        c2.run();
    }
}

 
在设计模式上来说最好选择用工厂方法模式,虽说工厂方法模式便于添加产品,但是实际上一般都用简单工厂,因为工厂方法模式的类肯定会挺多的,难的管理。
 
 

           


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00