1、什么是工厂模式
它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式 分为简单工厂、工厂方法、抽象工厂模式。
2、工厂模式的好处
(1)工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
(2)利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。
(3)将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
3、工厂模式应用场景
(1)如果有多个类,而且这些类还需要针对不同的情况来创建不同的对象,这时候就需要工厂了,我们可以在工厂中根据条件来创建具体的对象。
(2)动态地根据不同的类型创建不同的对象,考虑使用工厂模式,将这一大坨 if-else创建对象的代码抽离出来,放到工厂类中。
4、工厂模式分类
工厂模式分为简单工厂、工厂方法、抽象工厂模式。
简单工厂 :用来生产同一等级结构中的任意产品,相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称, 只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。
工厂方法 :用来生产同一等级结构中的固定产品,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
抽象工厂 :用来生产不同产品族的全部产品,简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。
5、代码实现
简单工厂模式
public interface Car {
public void run();
}
public class Bmw implements Car {
public void start() {
System.out.println("宝马汽车启动...");
}
}
public class AoDi implements Car {
public void start() {
System.out.println("奥迪汽车启动..");
}
}
public class CarFactory {
public static Car createCar(String name) {
if(name.equals("奥迪")){
return new AoDi();
}
if(name.equals("宝马")){
return new Bmw();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
Car aodi =CarFactory.createCar("奥迪");
Car bmw =CarFactory.createCar("宝马");
aodi.start();
bmw.start();
}
}
工厂方法模式:
public interface Car {
public void start();
}
public interface CarFactory {
Car createCar();
}
public class AoDi implements Car {
public void start() {
System.out.println("奥迪汽车..");
}
}
public class Bmw implements Car {
public void start() {
System.out.println("宝马汽车...");
}
}
public class AoDiFactory implements CarFactory {
public Car createCar() {
return new AoDi();
}
}
public class BmwFactory implements CarFactory {
public Car createCar() {
return new Bmw();
}
}
public class Client {
public static void main(String[] args) {
Car aodi = new AoDiFactory().createCar();
Car bmw = new BmwFactory().createCar();
aodi.start();
bmw.start();
}
}
抽象工厂
// 汽车 工厂及实现类
public interface Car {
void run();
}
class CarA implements Car{
public void run() {
System.out.println("宝马");
}
}
class CarB implements Car{
public void run() {
System.out.println("电动车");
}
}
// 发动机 工厂及实现类
public interface Engine {
void run();
}
class EngineA implements Engine {
public void run() {
System.out.println("跑的快!");
}
}
class EngineB implements Engine {
public void run() {
System.out.println("跑的慢!");
}
}
// 总工厂,及实现类
public interface TotalFactory {
// 创建汽车
Car createChair();
// 创建发动机
Engine createEngine();
}
//由他决定调用哪个工厂的那个实例
class TotalFactoryImpl implements TotalFactory {
public Engine createEngine() {
return new EngineA();
}
public Car createChair() {
return new CarA();
}
}
public class Test {
public static void main(String[] args) {
TotalFactory totalFactory = new TotalFactoryImpl();
Car car = totalFactory.createChair();
car.run();
TotalFactory totalFactory2 = new TotalFactoryImpl();
Engine engine = totalFactory2.createEngine();
engine.run();
}
}
您的点赞就是对我最大的鼓励。[玫瑰][玫瑰][玫瑰]
,