java中抽象工厂模式和原型模式之间的区别

Python021

java中抽象工厂模式和原型模式之间的区别,第1张

工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。

抽象工厂模式:这个模式我总是感觉和builder模式非常相似。

工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。

有人做如下的比较:

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

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

}

}