工厂系列有:简单工厂、静态工厂、工厂方法、抽象工厂。
任何可以产生对象的方法或类,都可以称之为工厂,单例也是一种工厂。
Spring的IOC会用到工厂模式。
我们知道,产生对象的方式是:new一个。
为了能够灵活控制生产的过程,添加权限,给对象添加修饰,就有了工厂模式。
在创建对象的时候,我们可以使用new的方式,这种方式缺少对对象的控制,使用产生了工厂方法,通过创建一个工厂(一般是单例的),每当需要一个对象的时候,通过工厂创建方法创建一个对象并返回,在创建方法里可以添加一些逻辑控制。
如果我需要创建一个新的Plane类,创建Plane对象,同样需要这么new,当这种类多了之后,每次都要修改,此时,便可以抽象出来一个Movable接口,接口里写一个go()方法,各个类实现go()方法。
package com.mashibing.dp.factorymethod;
public interface Movable {
void go();
}
package com.mashibing.dp.factorymethod;
public class Car implements Movable {
public void go() {
System.out.println("Car go wuwuwuwuw....");
}
}
package com.mashibing.dp.factorymethod;
public class CarFactory {
public Moveable create() {
System.out.println("a car created!");
return new Car();
}
}
package com.mashibing.dp.factorymethod;
public class Main {
public static void main(String[] args) {
Moveble m = new CarFactory().create();
m.go();
}
}
下面介绍抽象工厂,首先顶一个抽象工厂类,用于产生抽象的产品,但是这个抽象工厂可以产生一系列的产品,这一系列的产品可能没有直接联系,但是抽象工厂产生的这些产品,可以构造成一个产品族,其中的Food、Vehicle、Weapon是抽象类,会对应多个不同的是具体实现,所以可以将这么多的实现进行组合。这个AbastractFactory就像一个模板一样,按照这个模板里提供的属性创建对象,就产生了一个个产品。
package com.mashibing.dp.abstractfactory;
public abstract class AbastractFactory {
abstract Food createFood();
abstract Vehicle createVehicle();
abstract Weapon createWeapon();
}
package com.mashibing.dp.abstractfactory;
public class Main {
public static void main(String[] args) {
AbastractFactory f = new ModernFactory();
Vehicle c = f.createVehicle();
c.go();
Weapon w = f.createWeapon();
w.shoot();
Food b = f.createFood();
b.printName();
}
}
思考:工厂方法和抽象工厂的区别。
工厂方法只有一个抽象的产品类,抽象工厂可以有多个抽象产品类。工厂方法每次只能创建一个具体产品类的实例,抽象工厂可以创建多个产品类的实例。