前言
简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入。
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单工厂
简单工厂说白了就是包装了if else的一段代码,对象我不想自己创建了,工厂你根据我给你的产品名,给我一个对象就好了,具体细节我不关心.
class FruitFactory{
public Fruit getFruit(String fruitName){
if ("apple".equals(fruitName)) {
return new Apple();
}else if ("banana".equals(fruitName)) {
return new Banana();
} else if ("orange".equals(fruitName)) {
return new Banana();
}else {
return null;
}
}
}
public interface Fruit{
void fun();
}
public class Orange implements Fruit {
@Override
public void fun() {}
}
public class Apple implements Fruit{
@Override
public void fun() {}
}
public class Banana implements Fruit{
@Override
public void fun() {}
}
- 有什么问题? 再有新的产品需要创建,需要改动原来的if else 的代码,不符合 对修改关闭原则, 优化下,于是看下面的工厂方法.
二、工厂方法
- 怎么理解?
一个工厂,包含一个方法. 就是说一个工厂负责生产一个产品,其他的一概不管
interface Factory{
Fruit create();
}
public class OrangeFactory implements Factory{
@Override
public Fruit create() {
return new Orange();
}
}
public class BananaFactory implements Factory{
@Override
public Fruit create() {
return new Banana();
}
}
public class AppleFactory implements Factory{
@Override
public Fruit create() {
return new Apple();
}
}
public static void main(String[] args) {
Fruit orange = new OrangeFactory().create();
Fruit apple = new AppleFactory().create();
Fruit banana = new BananaFactory().create();
}
- 现在看起来没什么挺好,可是还有问题,如果水果种类增加了怎么搞,再增加10个水果,就得再增加10个工厂? 优化下,于是有了抽象工厂.
三、抽象工厂
- 怎么理解?
看名字,抽象的是什么? 工厂! 为了解决工厂太多的问题, 把相同类型的工厂都统一到一块; 一个类型的工厂,只生产一个系列的产品
public class AbstractFactory{
Apple createApp(){
return new Apple();
}
Orange createOrange(){
return new Orange();
}
Banana createBanana(){
return new Banana();
}
}
public static void main(String[] args) {
Apple app = new AbstractFactory().createApp();
Banana banana = new AbstractFactory().createBanana();
Orange orange = new AbstractFactory().createOrange();
}
总结
现在记住名字, 你就应该知道这个模式做了什么事情了
- 简单工厂: if else 控制, 创建对象
- 工厂方法: 一个工厂一个方法; 不同工厂创建不同对象
- 抽象工厂: 为解决工厂太多的问题,把相同系列的产品归到一个工厂里去
详细教程推荐 阿里巴巴淘系技术的这篇回答: 工厂设计模式