工厂方法模式
描述
定义一个穿件对象的工厂接口,让子类决定实例化哪一个类。
关键点
- 抽象工厂类角色:核心,具体工厂角色必须实现的接口或者父类。
- 具体工厂角色:含有一定的商业逻辑和判断逻辑,在java中往往是一个具体类的实现。
- 抽象产品角色: 具体产品的的父类(一般是产品的通用特性:如宝马汽车和奥迪汽车通用特性都是汽车)。在java中往往是接口或者抽象类。
- 具体产品角色:工厂类的具体实现(如生产宝马汽车,奥迪汽车)。
优点
- 符合开-闭原则:新增一种产品,只需增加具体产品类和相对应的工厂子类就可以
缺点
新增一种产品需要增加一个产品类和一个具体的子工厂,增加系统负担。
代码实现
1.抽象工厂类角色
public interface CarFactory_m {
public Car_m pruduct();
}
- 具体工厂角色
public class AodiFactory_m implements CarFactory_m{
public Car_m pruduct() {
return new AodiCar_m();
}
}
public class BmwFactory_m implements CarFactory_m{
public Car_m pruduct() {
return new BmwCar_m();
}
}
3.抽象产品角色
//抽象类
public interface Car_m {
//生产车
public void create();
}
4.具体产品角色
public class BmwCar_m implements Car_m {
public void create() {
System.out.println("生产宝马汽车!!!");
}
}
public class AodiCar_m implements Car_m {
public void create() {
System.out.println("生产奥迪汽车!!!");
}
}
跟简单工厂的区别
2个有没优劣之分,只有适合以及不适合。工厂方法的代码就是在简单工厂的基础上再定义了一个工厂的接口,优点很明显。当我们需要增加一种产品的时候,比如增加奔驰汽车。工厂方法的设计模式可以不修改原来代码的基础上,增加1个工厂具体角色,1个具体产品角色就可以。但是简单工厂必须在工厂类上增加业务逻辑。违背了开-闭原则。但是缺点也是很明显,当产品越多时,类会多出很多。
抽象工厂模式
描述
给客户提供一个接口,负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
关键点
- 抽象工厂类角色:核心,具体工厂角色必须实现的接口或者父类。
- 具体工厂角色:含有一定的商业逻辑和判断逻辑,在java中往往是一个具体类的实现。
- 抽象产品角色: 具体产品的的父类(一般是产品的通用特性:如宝马汽车和奥迪汽车通用特性都是汽车)。在java中往往是接口或者抽象类。
- 具体产品角色:工厂类的具体实现(如生产宝马汽车,奥迪汽车)。
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
代码实现
1.抽象工厂类角色
public interface Factory_a {
//生成汽车
public Car_a pruductCar();
//生产飞机
public Plane_a pruductPlane();
}
- 具体工厂角色
public class AodiFactory_a implements Factory_a {
public Car_a pruductCar() {
return new AodiCar_a();
}
public Plane_a pruductPlane() {
return new AodiPlane_a();
}
}
public class BmwFactory_a implements Factory_a {
public Car_a pruductCar() {
return new BmwCar_a();
}
public Plane_a pruductPlane() {
return new BmwPlane_a();
}
}
3.抽象产品角色
//抽象类
public interface Car_m {
//生产车
public void create();
}
//抽象类
public interface Plane_a {
//生产飞机
public void create();
}
4.具体产品角色
public class BmwCar_m implements Car_m {
public void create() {
System.out.println("生产宝马汽车!!!");
}
}
public class AodiCar_m implements Car_m {
public void create() {
System.out.println("生产奥迪汽车!!!");
}
}
public class AodiPlane_a implements Plane_a {
public void create() {
System.out.println("生产奥迪飞机!!!");
}
}
public class BmwPlane_a implements Plane_a {
public void create() {
System.out.println("生产宝马飞机!!!");
}
}
对比工厂方法
抽象方法就是工厂方法的延伸版,可以称之为超级工厂。解决工厂方法中层级单一的问题。
总结
简单工厂模式,工厂方法模式,抽象工厂,都是工厂模式。最终目的就是为了解耦。
网友评论