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(); } }
在设计模式上来说最好选择用工厂方法模式,虽说工厂方法模式便于添加产品,但是实际上一般都用简单工厂,因为工厂方法模式的类肯定会挺多的,难的管理。