何为工厂模式?
工厂模式主要为创建对象提供过渡接口。屏蔽对象的实例化具体过程,以达到灵活的作用。
工厂模式分为以下三种:
- 简单工厂模式(静态工厂模式)
- 工厂方法模式
- 抽象工厂模式
简单工厂模式和抽象工厂模式是对工厂方法模式的扩展。与工厂方法模式也有千丝万缕的关系。下面就以工厂方法模式为例。
工厂方法模式
在单例模式中,要求只能存在唯一类实例,也就是只能有一个女朋友实例存在,今天,我们通过工厂模式批量创建女朋友试试。
首先有个女朋友接口,她喜欢买东西。
public interface GirlFriend {
void buy();
}
女朋友们的爱好不同,有的喜欢买包包,有的喜欢买口红,有的喜欢…
//爱买包包的女朋友
public class GirlFriendImpl1 implements GirlFriend {
@Override
public void buy() {
System.out.println("买包包");
}
}
//爱买口红的女朋友
public class GirlFriendImpl2 implements GirlFriend {
@Override
public void buy() {
System.out.println("买口红");
}
}
现在不同爱好的女朋友有了,现在我们需要一个工厂来为我们批量生产下女朋友?
public interface GirlFriendFactory{
GirlFriend createGirlFriend();
}
上面是一个工厂接口,因为我们需要生产出两种不同实例的女朋友,因此需要两个不同的工厂实现去替我们完成这件事。
//生产买包包的女朋友
public class GirlFriendFactoryImpl1 implements GirlFriendFactory {
@Override
public GirlFriend createGirlFriend(){
return new GirlFriendImpl1();
}
}
//生产买口红的女朋友
public class GirlFriendFactoryImpl2 implements GirlFriendFactory {
@Override
public GirlFriend createGirlFriend(){
return new GirlFriendImpl2();
}
}
什么都有了,就是不知道这个女朋友们能不能有,来测试一下看看
public class FactoryTest {
public static void main(String[] args) {
//创建工厂实例
GirlFriendFactory girlFriendFactory1 = new GirlFriendFactoryImpl1();
//通过对应的工厂实例创建对应的女朋友
GirlFriend girlFriend1 = girlFriendFactory1.createGirlFriend();
girlFriend1.buy();
GirlFriendFactory girlFriendFactory2 = new GirlFriendFactoryImpl2();
GirlFriend girlFriend2 = girlFriendFactory2.createGirlFriend();
girlFriend2.buy();
}
}
到此为止,我们成功的有了两个女朋友,一个爱买包包,一个爱买口红。可是万一以后我们又有一个新的女朋友买好衣服该怎么办(卧槽,我连一个女朋友都没有,你丫的左拥右抱两三个女朋友),这时我们就需要再实现一个爱买衣服的女朋友以及她对应的工厂,这样下次会增多我们的类,因此我们也可以通过反射来完成对工厂的实现。
这就是工厂方法模式,而简单工厂方法模式就是在工厂方法模式的基础上直接使用一个具体的工厂来创建实例,而不是通过一个工厂接口,这样做当然也暴露出了对象的具体实现过程。
工厂模式的优缺点
优点:
- 通过对外提供接口,屏蔽产品(女朋友)的具体实现。
- 可扩展性。当我们需要增加产品类型时,只需要增加对应的工厂实现。
- 耦合度降低,当我们需要创建一个产品时,我们只需要它的名字,工厂会帮我们完成创建任务。
缺点:
- 增加系统复杂度。当我们需要增加产品类型时,不仅需要创建产品的实体类,还需要增加生产产品的工厂实现类。
工厂模式的应用场景
- 一个类有很多子类。
- 系统后期经常需要扩展。
- 创建某个对象需要很多额外的操作。