Java的几个工厂方法解析

Python016

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

}

}

这种方法多用在业务逻辑方面,向外面只暴露接口,隐藏具体算法细节。灵活度高,容易扩展。 例如结算工资,每个部门,每个人的工资可能不一样(包括基本工资,加层,项目奖金,税等等一些列算法)。 你只需要一个口接口,具体实现交给具体类去做,这样你就可以根据不同的类,得到不同的结果。