定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
主要解决:主要解决接口选择的问题。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
实现方式:让工厂类根据名称创建对象,并返回该对象的抽象类
场景:大家可能不知道,本人是从一个大山深处的一户果农家走出的孩子,最近家那边修了马路,有不少批发商去采购水果,什么桃啊、李啊、橘啊、西瓜啊等各种水果。他们根本不关心你是怎么种出来的,只要知道这里能收到某种水果,能以低价收购就成。
所以这里以批发商收购水果进行模拟。
我们想卖出自己的农产品,就得让人家知道你的价格,我们先创建一个水果的接口类
Fruit.java
public interface Fruit {
void price();
}
既然卖农产品,就得有产品是吧,所以这里创建接口的实现类,这里就演示 2 种水果桃子、橘子
Peach.java
public class Peach implements Fruit {
@Override
public void price() {
System.out.println("桃子11.9");
}
}
Orange.java
public class Orange implements Fruit {
@Override
public void price() {
System.out.println("橘子5.8");
}
}
交易市场,怎么理解呢?批发商来收购水果,不可能自己一家家进行拜访吧,所以会有有个地方进行组织,就是交易市场的意思。批发商只要来到这个地方,报出你要进购的水果可以了,避免了自己一家家上门收购。
FruitFactor.java
public class FruitFactory {
/**
* 通过名称获取水果对象
* @param name
* @return
*/
public Fruit buyFruit(FruitEnum name) {
if (name == null) {
return null;
}
if (FruitEnum.PEACH == name) {
return new Peach();
}
if (FruitEnum.ORANGE == name) {
return new Orange();
}
return null;
}
}
这里增加了枚举类作为常量值
通过交易市进购取水果,获取水果实现类的对象
Main.java
public class Main {
public static void main(String[] args) {
FruitFactory factory = new FruitFactory();
// 获取桃子对象
Fruit peach = factory.buyFruit(FruitEnum.PEACH);
peach.price();
// 获取橘子对象
Fruit orange = factory.buyFruit(FruitEnum.ORANGE);
orange.price();
}
}