简单工厂模式
一种创建对象方式的简单封装,我觉得它的本质上除了能让开发者少记忆一些实例的类名,和直接new的差别不大。
- 最小化工厂
- 实体类:
Apple
,代码:
public class Apple{
public Apple(){
// whatever
}
}
- 苹果工厂,
AppleFactory
:
public class AppleFactory{
public static Apple getAppleInstance(){
return new Apple();
}
}
- 客户端
public class Client{
public static void main(String[] args) {
Apple apple = AppleFactory.getAppleInstance();
// ...
}
}
这可以说是最简单的工厂方法的使用了,没有接口,一个类对应一个工厂类,通过工厂类的静态方法创建对象。
但是看完这个可能要怀疑人生,我为什么要把new Apple()变的复杂了?单纯的new不是很简洁吗?
不错,这种情况下,就是在套用设计模式而失去设计模式了。
那么简单工厂适合什么样的场景呢?就像开头所说,帮助开发者记忆类名方便开发者。那么场景就是,同接口的实现类比较多的情况下的对象实例化的封装了。
- 合适的简单工厂
一个Fruit接口,5个实现类:Apple,Banana,Orange,Watermelon,Strawberry。
代码:
public interface Fruit{
void name();
}
public class Apple implements Fruit {
@Override
public void name() {
// TODO Auto-generated method stub
}
}
public class Banana implements Fruit {
@Override
public void name() {
// TODO Auto-generated method stub
}
}
public class Orange implements Fruit {
@Override
public void name() {
// TODO Auto-generated method stub
}
}
public class Watermelon implements Fruit {
@Override
public void name() {
// TODO Auto-generated method stub
}
}
public class Strawberry implements Fruit {
@Override
public void name() {
// TODO Auto-generated method stub
}
}
假设我们记不住我有多少种水果,于是我再写一个Enum,FruitEnum
public enum FruitEnum{
APPLE,BANANA,ORANGE,WATERMELON,STRAWBERRY;
}
然后我的工厂要借助这个Enum生产水果:FruitFactory
public class FruitFactory{
public static Fruit getFruit(FruitEnum category){
switch(category){
case FruitEnum.APPLE:
return new Apple();
//...
}
}
}
Client代码:
public class Client{
public static void main(String[] args) {
Fruit apple = FruitFactory.getFruit(FruitEnum.APPLE)
}
}
可能自己看了还是觉得麻烦,直接new不是很好嘛。这样设计的理由,一方面,时间久了自己会忘记,另外一方面,要觉得自己的代码,是要给别人用的。
简单工厂很简单,简直不能说是设计模式。(妄下评论)