Factory_工厂模式

使用工厂模式的目的,是将选择实现类,创建对象统一管理和控制,从而将调用者和创建者解耦

场景需求

public interface Car { public void name(); } //Car车接口

现在有两种车:五菱宏光和特斯拉

//五菱宏光
public class Wuling implements Car{
    public void name(){ System.out.println("五菱宏光"); }
}
//特斯拉
public class Tesla implements Car{
    public void name(){ System.out.println("特斯拉"); }
}

如果张三想要一辆五菱宏光,他只能自己徒手造车。

public class ZhangSan {
    public static void main(String[] args) {
        Car wuling = new Wuling();
        wuling.name();
    }
}

但如果生产五菱宏光很麻烦,需要很多张三不知道的参数,所以他只能去买一辆,于是他来到了4S店...


简单工厂模式

首先了解一下简单工厂设计模式,又叫静态工厂模式,它不属于23种设计模式之一

那么4S店的老板会问你:小伙子~你想要买什么呀?是买五菱宏光呢,还是买特斯拉呀~

public class FourS_Factory {
    public static Car BuyCar(String carName){
        if("五菱宏光".equals(carName)){
            return new Wuling();
        }else if ("特斯拉".equals(carName)){
            return new Tesla();
        }else{
            System.out.println("抱歉!没货~");
            return null;
        }
    }
}

张三说:老板,给我来辆五菱宏光!,于是乎4S店的老板就卖给张三一辆五菱宏光。

public class ZhangSan {
    public static void main(String[] args) {
        Car wuling = FourS_Factory.BuyCar("五菱宏光");
        wuling.name();
    }
}

这就是简单工厂,它并没有满足开闭原则,如果门店上新,工厂里的判断要增加,必然会修改原有代码。虽然某种程度上不符合设计原则,但实际使用最多!


工厂方法模式

工厂方法模式给每个实现类都定义了一个实现工厂接口的工厂类,完全实现了开闭原则

public interface CarFactory {
    Car create();
}

为了不被4S店中间商赚差价,张三直接找到了生产五菱宏光的工厂买车...

public class WulingFactory implements CarFactory {
    @Override
    public Car create() { return new Wuling(); }
}
public class ZhangSan {
    public static void main(String[] args) {
        Car wuling = new WulingFactory().create();
        wuling.name();
    }
}


工厂方法模式,虽然符合开闭原则,但代码量变多了。


抽象工厂模式

假设现在有华为和小米两个厂商,每个厂商又都生产手机和路由器两种商品,那么22得4,有4个具体的产品。

//手机接口
public interface Phone { public void call(); }
//路由器接口
public interface Router { public void connect(); }

不管是哪个厂商,手机都应该实现手机接口重写呼叫方法call(),路由器都应该实现路由器接口重写连接方法connect()

public class HuaWeiPhone implements Phone {
    public void call() { System.out.println("华为手机呼叫中..."); }
}
public class HuaWeiRouter implements Router {
    public void connect() { System.out.println("华为路由器连接中..."); }
}

那么现在有一个工厂接口,所有工厂都应该实现这个接口,每个具体的工厂都应该能创建手机和路由器。

public interface SuperFactory {
    Phone createPhone();
    Router createRouter();
}

例如现在有一个华为工厂,那它生产的手机就是华为手机,生产的路由器就是华为的路由器

public class HuaWeiFactory implements SuperFactory {
    @Override
    public Phone createPhone() { return new HuaWeiPhone(); }
    @Override
    public Router createRouter() { return new HuaWeiRouter(); }
}

那么张三现在想买一部华为手机,那么他就要去华为工厂就可以买到..

public class ZhangSan {
    public static void main(String[] args) {
        HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
        Phone phone = huaWeiFactory.createPhone();
        phone.call();
    }
}

抽象工厂模式将一个系列相关的具体产品统一到一起创建,例如华为系列,小米系列...各个系列之间是分离的,所以在添加新的系列时不用动其他原有的代码,但是规定了每个系列中的产品集合,要扩展新的产品会很困难。

posted @ 2022-07-24 19:19  独游空想家  阅读(58)  评论(0编辑  收藏  举报