实战解析:工厂模式解决构建对象依赖树的耦合问题

759 阅读1分钟

// ====================弊端================

  1. 码结构:分两层:顶层IContext,底层Service。
  2. 结构优势:顶层上下文IContext为各Service之间提供通信功能,各个Service以自身业务为边界。
  3. 代码缺点:创建对象需要大量重复代码,顶层需要维护各底层的对象创建

// ========================================

void main() {
	Global global = new Global();
	
	//入口
	global.getService1();
	global.getService2();
	global.getService3();
	
}

interfact IContext {
	Service1 getService1();
	Service2 getService2();
	Service3 getService3();
}

class Global implete IContext{
	
	Service1 getService1(){ new Service1(this) }
	Service2 getService2(){ new Service2(this) }
	Service3 getService3(){ new Service3(this) }
	
}

abstract class Service{
	IContext mIContext;
	custruct(IContext context){
		this.mIContext = context;
	}
}

class Service1 extend Service{}

class Service2 extend Service{}

class Service3 extend Service{}

// ====================优化1===============

  1. 假设每个Service的构造函数输入的参数各不相同,那么将会导致顶层的代码错综复杂,此时则需将底层对象创建转移到工厂类中
  2. 以下结构优势:顶层无需关注底层Service对象的生成,统一使用Factory构造。代码解耦,简洁。
  3. 总结:此结构用于构建对象树非常简单方便,可以大量应用到项目中。

// ========================================

void main() {
	//使用依赖注入,生成各个factory
	
	//通过依赖注入获取到GlobalFactory
	GlobalFactory factory;
	Global global = factory.create();
	
	//入口
	global.getService1();
	global.getService2();
	global.getService3();
	
}
interface IContext {
	Service1 getService1();
	Service2 getService2();
	Service3 getService3();
}

class Global implete IContext{

	construc(Service1Factory factory1, Service2Factory factory2, Service3Factory factory3){
		this.factory1 = factory1;
		this.factory2 = factory2;
		this.factory3 = factory3;
	}
	
	Service1 getService1(){ return factory1.create(this) }
	Service2 getService2(){ return factory2.create(this) }
	Service3 getService3(){ return factory3.create(this) }
	
}

abstract class Service{
	IContext mIContext;
	custruct(IContext context){
		this.mIContext = context;
	}
}

class GlobalFactory {

	construct(Service1Factory factory1, Service2Factory factory2, Service3Factory factory3){
		this.factory1 = factory1;
		this.factory2 = factory2;
		this.factory3 = factory3;
	}
	
	Global create(){
		return new Global(factory1,factory2,factory3);
	}
	
	
}

class Service1Factory {
	construct(A a){
		this.a = a;
	}
	
	
	Service1 create(IContext context){
		return new Service1(this.a, context);
	}
	
}
class Service2Factory {
	construct(B b){
		this.b =b;
	}
	
	
	Service1 create(IContext context){
		return new Service1(this.b, context);
	}
}
class Service3Factory {
	
	construc(){}
	
	Service3 create(){
		return new Service3();
	}
}

class Service1 extend Service{ construc(A a, IContext context) {super(context);} }

class Service2 extend Service{ construc(B b, IContext context) {super(context);} }

class Service3 extend Service{}