Java的几个工厂方法解析

Python030

Java的几个工厂方法解析,第1张

Java工厂模式可分为三种:

1.静态工厂模式

2.工厂方法模式

3.抽象工厂模式

一、静态工厂模式:用静态的方法实现,其创建的对象具有一定的特性

举例如下:

Vehicle类:

public abstract class Vehicle

{

private String name

public Vehicle (){

super()

}

public Vehicle (String name){

super()

this.name=name

}

public abstract void run()

public String getName(){

return name

}

public void setName(String name){

this.name=name

}

}

Bus类:

public class Bus extends Vehicle

{

private String name

public Bus(){}

public Bus(String name){

super(name)

}

@Override

public abstract void run(){

System.out.println("Bus is running")

}

}

Car类:

public class Car extends Vehicle

{

private String name

public Car(){}

public Car(String name){

super(name)

}

@Override

public abstract void run(){

System.out.println("Car is running")

}

}

静态工厂类:

(静态工厂创建一个对象,

静态工厂创建的对象一般都有一个共同的特性,

继承自某一个类,

或者引用一个接口

public class StaticFactory{

public static Object getInstance(String className){

Object instance=null

try{

Class c=Class.forName(className)

instance=c.newInstance()

}catch(Exception e){}

return instance

}

public static Object getInstance(String className,Object ...args){

Class c=null

try{

c=Class.forName(className)

}catch(Exception e){}

Constructor[] cons=c.getConstructors()

Object instance=null

for(Constructor con:cons){

Class<?>[] cs=con.getParmeterTypes()

if(cs.length>0){

boolean isConstructor=true

for(int i=0i<cs.lengthi++){

Class t=cs[i]

if(!t.isInstance(args[i])){

isConstructor=false

}

}

if(isConstructor){

try{

instance=con.newInstance(args)

break

}catch(Exception e){}

}else{

continue

}

}

}

return instance

}

}

二、工厂方法模式:主要是对各类东西分类生产,但分类生产的对象仍然具有某一特性。

如果说静态工厂是一个综合的交通工具建造工厂,

那么工厂方法模式就是具体分工,分成Bus与Car的工厂,

各自生产各自的产品,但是造出来的还是交通工具。

交通工具制造接口:

public interface VehicleMake{

/**制造交通工具**/

public Vehicle make()

}

Bus制造类:

public class BusMake implements VehicleMake{

@Override

public Vehicle make(){

Vehicle bus=new Bus()

System.out.println("Bus工厂制造了一辆Bus")

return bus

}

}

Car制造类:

public class CarMake implements VehicleMake{

@Override

public Vehicle make(){

Vehicle car=new Car()

System.out.println("Car工厂制造了一辆Car")

return car

}

}

三、抽象工厂模式:抽象工厂生产的对象可能是没有共同特性的。比如,一个制造工厂BusMake不仅能制造Bus还能生产轮胎wheel等配件,Bus是交通工具,wheel是配件(代码中有部分类没具体写出来只给了类名)

总工厂(抽象工厂总接口):

public interface WheelVehicleMake extends VehicleMake{

/**制造轮胎**/

public Wheel makeWheel()

}

轮子BusMake:

public class WheelBusMake implements WheelVehicleMake{

@Override

public Vehicle make(){

Vehicle bus=new Bus()

System.out.println("WheelBusMake生产了一辆Bus")

return bus

}

@Override

public Wheel makeWheel(){

Wheel busWheel=new BusWheel()

System.out.println("WheelBusMake生产了一个Bus轮子")

return busWheel

}

}

轮子CarMake:

public class WheelCarMake implements WheelVehicleMake{

@Override

public Vehicle make(){

Vehicle car=new Car()

System.out.println("WheelCarMake生产了一辆Car")

return car

}

@Override

public Wheel makeWheel(){

Wheel carWheel=new CarWheel()

System.out.println("WheelCarMake生产了一个Car轮子")

return carWheel

}

}

我简单的说下,举个例子,当我们的程序结构比较繁杂时,比如有100个类,而类中又有很多方法,这些方法之间都互相有依赖关系,也就是一个方法之间的某段逻辑处理需要用到另一个类中的代码逻辑,这种时候对于整个程序而言是非常不利于开发的(我们需要考虑到很多类、方法之间的耦合问题),那么就有一个概念了,也就是面对接口编程。通俗的说就是把类中的方法封装起来,外部调用的人完全不需要考虑方法是如何实现的,但是这样做也有一个不好的地方,我们的接口是不提供方法实现的,而需要在类中实现接口的方法。那么问题产生了,我们在new接口对象的时候需要明确的知道他的实例类。

想象一下,如果程序在继续庞大,接口非常多,接口实例类非常多,这样又会产生我们之前的问题(我们需要考虑到很多类、方法之间的耦合问题)那么这个时候就产生了一中设计思想,也就是工厂模式,这种模式的核心思想就是管理接口的实例对象,把接口和实例对象之间的关系封装起来处理,外部需要用到某个接口的实例时,由工厂进行分配,而不需要关注具体是哪个实例。

如果你做到比较复杂的程序时你应该就能体会到了。