首先,我编码到现在,从没自己写过工厂模式。。 我创建新类的时候从来都是new出来的。
最近在学设计模式,写一下自己的心得,现在水平不行,心得也只能点到为止,以后如果有机会成大牛会回头修改。
设计模式里面最容易理解的是单例模式,就不说了。看工厂模式的时候不明白为啥工厂创建的就比new出来的好。。。 网上答案说啥的都有。。 竟然还有人说new出来1000个对象,如果要修改的话就要修改1000个地方。。。 不知道有构造函数嘛。。。修改构造函数就行了,一个即可。。。
其实,很长时间里学设计模式都想错了。。。 我看设计模式,都是从自己的角度出发看他,就像工厂模式,怎么看怎么觉得还是new比较顺眼,而设计模式这东西,从来都不是为某个人提供的。。 设计模式不是一门技术.说白了,他是为公司准备的,为了让公司在离开你以后,另外一个人能迅速上手你修改过的代码,这不就是易扩展嘛。。 公司里面一个项目组肯定很多人,你的代码,跟别人的代码肯定有相互调用,可能你的bug,会导致一大片别人代码出bug,这也是设计模式要解决的主要问题:解耦。
工厂模式,其实最大的用处还是解耦(个人观点),你的代码最少情况下影响我的,这是在一个大项目编程时很大一个原则。就像设计模式里面的依赖倒转原则,依赖于抽象而不依赖于实现,就是为了解耦。
举个很简单的例子:
一个项目组,两个人编程,产品类需要A编码,消费类需要B编码,然后B消费的时候需要A的产品。如果用工厂模式,A只需要事先提供工厂的接口即可,然后A编A的,B编B的,B只需要依赖于A的抽象接口即可,不用依赖与实体类A。而且A还可以提供一个工厂接口给B,让B继承,比如说B可以修改工厂,在创建A之前或之后添加自己的逻辑。A不可能让B修改自己的构造函数吧? 那样太霸道了。这就很好的将A的创建和使用的逻辑分离开了。
另外,还有一个好处就是,跟现实世界关联起来,容易联想,也就容易看懂代码。
以上是自己理解的,工厂类和直接new的区别,水平有限,只能理解到这了。。 最后一个观点来自java的线程池方法:Executors.newCachedThreadPool(threadFactory),利用工厂构造线程池,传递工厂参数,试想一下,这里如果不是工厂,java可能让你重写Thread的构造函数吗。。
下面就是工厂的java实现了,网上很多,写来备查:
简单工厂:
/** * IA: A的接口 * @author xuejupo [email protected] * create in 2015-12-18 下午9:43:07 * */ interface IA{ void myMethod(); } /** * A: */ class A implements IA{ public void myMethod(){ System.out.println("A"); } } /** * simpleFactory: 简单工厂 */ class simpleFactory{ public static IA getA(){ return new A(); } }
工厂方法模式: 跟简单工厂模式很像,只不过有一个工厂接口,多个工厂实现工厂接口,每个工厂负责一个产品(这个接口可以暴漏给产品A的使用者,可以让使用者根据需要在A创建的时候增加自己的逻辑。)
/** * IA: A的接口 * @author xuejupo [email protected] * create in 2015-12-18 下午9:43:07 * */ interface IA{ void myMethod(); } /** * A: */ class A implements IA{ public void myMethod(){ System.out.println("A"); } } /** * A2: */ class A2 implements IA{ public void myMethod(){ System.out.println("A"); } } /** * factory: 工厂接口 */ interface factory{ public IA getA(); } /** * factoryMethod1: 工厂模式 */ class factoryMethod1 implements factory{ public IA getA(){ return new A(); } } /** * factoryMethod2: 工厂模式 */ class factoryMethod2 implements factory{ public IA getA(){ //这里可以写上自己的逻辑 return new A(); } }
抽象工厂模式:
interface IA1{ } interface IA2{ } class A11 implements IA1{ } class A21 implements IA2{ } /** * factory: 工厂接口 */ interface factory{ public IA1 getA1(); public IA2 getA2(); } class factory1 implements factory{ public IA1 getA1(){ return new A11(); } public IA2 getA2(){ return new A21(); } }
抽象工厂模式与工厂方法模式的不同在于: 工厂方法模式中,一个工厂只创建一种产品,而抽象工厂模式中,一个工厂可以创建多种产品系列,如上面的产品系列A1(其实就是接口)和产品系列A2。