从买房到工厂模式



最近发现一件很有意思的事情,就是和同事一起吃饭聊天的话题一直在改变。梳理以下就是这样一种过程:刚刚入职那会儿聊的内容一般都是游戏,中间有时候会讨论一会儿技术类的话题,而后话题就变成了旅游,再之后就变成了买房,现在变成了买房+理财。买房这个话题已经足足聊了半年多了,还没有终止的意思,所以可以窥见买房对一个社会人来说是多么重要,以至于能成为这么多人的共同话题。

当然今天也不是来讨论买房的,毕竟不能像土豪同事,买房和买菜一样。今天要总结另外一种设计模式------工厂模式。

看了下网上很多人都把工厂模式分为三种:1.简单工厂模式。2.工厂方法模式。3.抽象工厂模式。其实个人觉得就只有两种,一个简单工厂模式(不能算工厂的工厂模式),二就是抽象工厂模式了。这里还是按自己的想法来汇总。


普通工厂模式

现在有这么一个场景你想去租一个房,我们可以自己直接找房东租,也可以找中介租。普通工厂模式就可以理解为找中介租房。找中介有什么好处呢?安全,有保证等。这同样也是普通工厂模式的优点。当然你也可以选择直接找房东租,这样更经济,但是如果出了什么问题都需要你一个人区解决。

所以可以总结以下普通工厂模式就是“甩锅模式”。下面用代码演示

public class House {}//定义一个房子类,这里就忽略房东了。

public class HouseAgency {//定义租房中介,它有一个租房等方法(就是提供房子的方法)
    public House provideHouse() {
        return new House();
    }
}

public class FactoryTest {
    @Test
    public void simpleFactoryTest() {
        //我们直接找房东租房,这里忽略房东
        House house1 = new House();

        //我们通过租房中介租房
        HouseAgency agency = new HouseAgency();
        House house2 = agency.provideHouse();
    }
}

工厂方法/抽象工厂模式

工厂方法和抽象工厂模式就不好用买房来讲解了,那就看看这两种模式是怎么定义的。

工厂方法模式:定义一个用户创建对象的接口,让子类决定要实例化哪个类,使一个类的实例化延迟到其子类。

抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。

当产品只有一个的时候,抽象工厂模式就变成类工厂方法模式,当工厂方法模式的产品变成多个的时候,工厂方法模式就变成了抽象工厂模式。

下面来看一个买房的例子。

//定义房子接口,提供一个房产商名。
public interface House {
    String getBrandName();
}

//碧桂园类实现房子接口
public class BiGuiYuan implements House {
    public String getBrandName() {
        return "碧桂园";
    }
}
//万科类实现房子接口
public class WanKe implements House {
    public String getBrandName() {
        return "万科";
    }
}
//定义一个房产商中介类(其实这里也可以算是抽象工厂了),提供一个卖房的方法。
public abstract class HouseAgency {
    public abstract House provideHouse();
}
//碧桂园中介类实现房产商中介类。
public class BiGuiYuanAgency extends HouseAgency {
    @Override
    public House provideHouse() {
        return new BiGuiYuan();
    }
}
//万科中介类实现房产商中介类。
public class WanKeAgency extends HouseAgency {
    @Override
    public House provideHouse() {
        return new WanKe();
    }
}

public class FactoryTest {
    @Test
    public void FactoryTest() {
        HouseAgency biGuiYuanAgency = new BiGuiYuanAgency();
        System.out.println(biGuiYuanAgency.provideHouse().getBrandName());
        //碧桂园
        HouseAgency wanKeAgency = new WanKeAgency();
        System.out.println(wanKeAgency.provideHouse().getBrandName());
        //万科
    }
}

以上就是一个工厂方法模式,工厂模式的好处是可以容易横向扩展,即如果现在万达也开盘了,那么只要加个 WanDa 类实现 House 接口,再加个 WanDaAgency 工厂类继承 HouseAgency 就实现去万达中介买房了。

这里也看出工厂方法模式有个缺点就是如果房产商很多的话,类也会随之增多。(这也没办法,世界完美的事物总是难有)

如果什么时候这些房地产商不仅卖住宅还卖配套的设施服务,如学校等的时候,下面就需要在加 School 类,并在 HouseAgency 里添加一个 provideSchool 的方法(或者说是提供教学服务的方法)。这样一来,代码就变成抽象工厂模式了。

Comments
Write a Comment