设计模式--工厂模式的java实现

        首先,我编码到现在,从没自己写过工厂模式。。 我创建新类的时候从来都是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。

猜你喜欢

转载自709002341.iteye.com/blog/2265124
今日推荐