
目录
概述
无工厂模式
简单工厂模式
缺点
工厂方法模式
抽象工厂模式
概述
工厂模式实现创建者与调用者的分离,将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
无工厂模式没有工厂专门创建对象,对象的创建和对象的调用混在一起。
interface Car {//car与Audi、BYD 的关系其实更像继承,但这里仅做为例子
void run();
}
class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
public class NoFactoryDemo {
public static void main(String[] args) {
Car a = new Audi();
Car b = new Audi();
a.run();
b.run();
}
}
简单工厂模式
定义一个用于创建对象的工厂类。
interface Car {
void run();
}
class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
//工厂类
class CarFactory {
// 方式一
public static Car getCar(String type) {
if ("奥迪".equals(type)) {
return new Audi();
} else if ("比亚迪".equals(type)) {
return new BYD();
} else {
return null;
}
}
// 方式二
public static Car getAudi() {
return new Audi();
}
public static Car getBYD() {
return new BYD();
}
}
//调用者
public class Simple {
public static void main(String[] args) {
Car a = CarFactory.getCar("奥迪");
a.run();
Car b = CarFactory.getCar("比亚迪");
b.run();
}
}
缺点
对于增加新产品,不修改代码是无法扩展的。违反了开闭原则(对扩展放开;对修改封闭)。
工厂方法模式相对简单工厂而言,工厂方法模式有一组实现了相同接口的工厂类。这样再简单工厂模式里几重再工厂方法上的压力可以由工厂方法模式里的不同工厂子类来分担。
interface Car {
void run();
}
class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
class BYD implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑");
}
}
// 工厂接口
interface Factory {
Car getCar();
}
// 两个工厂类
class AudiFactory implements Factory {
@Override
public Car getCar() {
return new Audi();
}
}
class BYDFactory implements Factory {
@Override
public Car getCar() {
return new BYD();
}
}
// 调用者
public class FactoryMethod {
public static void main(String[] args) {
Car a = new AudiFactory().getCar();
Car b = new BYDFactory().getCar();
a.run();
b.run();
}
}
总结
简单工厂模式与工厂方法模式真正的避免了代码的改动了?
没有。在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就如上面的例子一样)。而且产品对象创建条件的修改必然会引起工厂角色的修改。
面对这种情况,Java的反射机制与配置文件的巧妙结合突破了限制——在Spring框架中完美体现。
抽象工厂模式抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上。而且抽象工厂模式是三个模式里面最为抽象、最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还需满足以下条件:
- 系统中有多个产品族,而系统一次只可能消费其中一种族产品。
- 同属于同一个产品族的产品以其使用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)