Java设计模式-工厂模式

2018-12-15  本文已影响0人  爱情绅士

工厂模式可以细分成三种:
1 简单工厂
2 工厂方法
3 抽象工厂

简单工厂

简单工厂.png
//定义一个手机接口,手机必须按照这个标准来
public interface Phone {
    String getName();
}
public class HuaWei implements Phone {
    @Override
    public String getName() {
        return "这是一个华为手机";
    }
}
public class XiaoMi implements Phone {
    @Override
    public String getName() {
        return "这是一个小米手机";
    }
}
/**
 * 简单工厂模式
 */
//定义一个生产手机的工厂类
public class PhoneFactory {

    static Phone getPhone(String name) {
        if (name.equals("华为")) {
            return new HuaWei();
        }else if (name.equals("小米")) {
            return new XiaoMi();
        }else {
            System.out.println("暂不生产该手机");
            return null;
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Phone phone=PhoneFactory.getPhone("华为");
        System.out.println(phone.getName());
    }
}

结果:

result.png
思考:世界上存在这种工厂吗?这么牛逼,同时生产华为和小米,乃至任何东西,不符合实际。引出 工厂方法模式

工厂方法

工厂方法.png
//声明一个工厂接口,工厂必须符合下面的标准
public interface FunctionFactory {
    Phone getPhone();
}
public class HuaWeiFactory implements FunctionFactory{
    @Override
    public Phone getPhone() {
        return new HuaWei();
    }
}
public class XiaoMiFactory implements FunctionFactory {
    @Override
    public Phone getPhone() {
        return new XiaoMi();
    }
}
public class Test {
    public static void main(String[] args) {
        Phone phone = new HuaWeiFactory().getPhone();
        System.out.println(phone.getName());
    }
}

结果:

result.png
思考:这个进阶版更加符合实际一点,各个工厂有自己的科技。但是用户需要知道厂家。引出 抽象工厂模式

抽象工厂

public abstract class Factory {
    public abstract Phone getPhone();

    public static Phone getPhoneByName(String name) {
        if (name.equals("华为")) {
            return new HuaWeiF().getPhone();
        }else if (name.equals("小米")) {
            return new XiaoMiF().getPhone();
        }else {
            System.out.println("暂不生产该手机");
            return null;
        }
    }
}
public class HuaWeiF extends Factory {
    @Override
    public Phone getPhone() {
        return new HuaWei();
    }
}
public class XiaoMiF extends Factory {
    @Override
    public Phone getPhone() {
        return new XiaoMi();
    }
}
public class Test {
    public static void main(String[] args) {
        Phone phone = Factory.getPhoneByName("华为");
        System.out.println(phone.getName());
    }
}

结果:

image.png
思考: 这个怎么样,用户不需要知道厂商,只关心结果。在简单工厂中,各个工厂的业务逻辑非常复杂,代码很乱。抽象工厂可以隐藏复杂的逻辑业务,易于维护。

结语

归纳一下

简单工厂模式
一个工厂生产各种各样的东西,看似功能强大,其实不现实。用户不关心怎么实现

工厂方法模式
定义一个工厂接口,在制定一些标准,比如:不同品牌的汽车工厂,都要实现这个接口,
都要实现这些标准,比如:汽车安全达标。
调用的时候,实例化工厂,用户需关心内部实现

抽象工厂模式
定义一个抽象工厂类,让其他工厂来继承他,拥有相同的方法不同的实现,对用户来说,不需要关心内部实现,对这个方法类来说。很好维护,如果在简单工厂中,各个工厂的业务逻辑非常复杂,代码很乱。抽象工厂可以隐藏复杂的逻辑业务,只关心结果。

PS:看懂了就要自己写出来,尝试换一个例子

上一篇 下一篇

猜你喜欢

热点阅读