概述
什么是工厂方法?什么是抽象工厂?
工厂方法是指工厂生产产品,而抽象工厂是生产产品系列。例如,工厂方法是只生产运输工具比如马车、公共汽车、自行车,而抽象工厂生产轮胎、螺丝钉交通工具零件。
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
简单工厂
交通工具创建者类
public interface VehicleFactory {
Vehicle create();
}
public class BicycleFactory implements VehicleFactory {
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bicycle();
}
}
public class CarriageFactory implements VehicleFactory{
public Vehicle create() {
return new Carriage();
}
}
public class BusFactory implements VehicleFactory{
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bus();
}
}
产品类
public interface Vehicle {
void run();
}
public class Bicycle implements Vehicle {
@Override
public void run() {
System.out.println("自行車 蹬蹬蹬");
}
}
public class Bus implements Vehicle{
@Override
public void run() {
System.out.println("bus 咚咚咚");
}
}
public class Carriage implements Vehicle {
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
System.out.println(</span>"马车 撇撇撇"<span style="color: #000000;">);
}
}
客户端
public class Client {
public static void main(String[] args) {
VehicleFactory factory=new CarriageFactory();
Vehicle vehicle=factory.create();
vehicle.run();
}
}
抽象工厂
public interface AbstractFactory {
//骑的坐骑
Vehicle createVehicle();
//拿的武器
Weapon createWeapon();
//补充的粮食
Food createFood();
}
class CarriageFacetory implements AbstractFactory{
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Carriage();
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> SteamedBun();
}
}
class BusFactory implements AbstractFactory{
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bus();
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Apple();
}
}
骑的交通工具
public interface Vehicle {
void run();
}
class Bus implements Vehicle{
@Override
public void run() {
System.out.println("bus 咚咚咚");
}
}
public class Carriage implements Vehicle {
@Override
public void run() {
System.out.println("马车 撇撇撇");
}
}
拿的武器
public interface Weapon {
void shot();
}
class AK47 implements Weapon{
@Override
public void shot() {
System.out.println("开Bus的手持ak47");
}
}
class Stick implements Weapon{
public void shot() {
System.out.println("骑马的拿着铁棍!");
}
}
吃的粮食
public interface Food {
void eat();
}
class Apple implements Food {
@Override
public void eat() {
System.out.println("开bus的吃苹果");
}
}
class SteamedBun implements Food{
@Override
public void eat() {
System.out.println("骑马的吃馒头");
}
}
客户端
public class Client {
public static void main(String[] args) {
AbstractFactory factory=new BusFactory();
Food f</span>=<span style="color: #000000;">factory.createFood();
Vehicle v</span>=<span style="color: #000000;">factory.createVehicle();
Weapon w</span>=<span style="color: #000000;">factory.createWeapon();
f.eat();
v.run();
w.shot();
}
}
总结
工厂方法与抽象工厂各有什么优缺点?
工厂方法一直都是围绕着产品这一个纬度,着重考虑怎么应对产品的变化。例如,新增一种类型的交通工具,并不要修改源码就能拓展成功,缺点就是工厂泛滥。
抽象工厂就是针对产品系列可拓展,例如新增某一种系列,人开着飞机去战斗,那么可以交通工具汽车,可以吃榴莲,手持导弹,可以轻松拓展进去。但是,弊端就是,系列工厂最开始要考虑周全,如果中途新增人还要有特定的服装,那就会非常麻烦。对于产品拓展不足。
???