Java设计模式-工厂模式
2018-12-15 本文已影响0人
爱情绅士
工厂模式可以细分成三种:
1 简单工厂
2 工厂方法
3 抽象工厂
简单工厂

//定义一个手机接口,手机必须按照这个标准来
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
思考:世界上存在这种工厂吗?这么牛逼,同时生产华为和小米,乃至任何东西,不符合实际。引出 工厂方法模式
工厂方法

//声明一个工厂接口,工厂必须符合下面的标准
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:看懂了就要自己写出来,尝试换一个例子