面试题工厂模式
提到工厂模式大多数码农都不陌生毕竟这中设计模式我们比较常见许多开源框架中也经常出现因此面试得时候一般也会问问。
工厂模式为三种:
1、简单工厂
2、工厂方法
3、抽象工厂
在搞明白三种方式之前呢!我们先定一个背景
假如有一个红娘给我们介绍对象 分别是车模、空姐、如花。 当然前提是你给多少钱才能决定让你见那个嘿嘿。
先看下类图:
接口就是红娘:
public interface IMatchmaker {
void meeting(String type);
}
车模妹子实现了红娘接口
public class CarModels implements IMatchmaker {
@Override
public void meeting(String type) {
}
}
貌美如花的空姐妹子也实现了红娘接口:
public class FlyModels implements IMatchmaker {
@Override
public void meeting(String type) {
}
}
如花大哥也实现了红娘接口:
public class FlowerModels implements IMatchmaker {
@Override
public void meeting(String type) {
}
}
好了妹子已经齐了(也包括如花大哥)
简单工厂
public class MatchMakerFactory {
public static IMatchmaker girl(String type) throws Exception{
IMatchmaker matchmaker;
if ("car".equals(type)){
matchmaker=new CarModels();
}
if ("fly".equals(type)){
matchmaker=new FlyModels();
}
if ("flower".equals(type)){
matchmaker=new FlowerModels();
} else {
throw new Exception("girl is not found go back");
}
return matchmaker;
}
}
这样就可以了,红娘可以根据你的类型选择出你喜欢的妹子了。当然最爱如花不解释。
有人说不对呀我就喜欢第一次见面的如花但是你每次给我搞一个新的。我不接受…于是那年又有了
静态工厂如下:
public class StaticMatchMakerFactory {
private static Map<String,IMatchmaker> map=new HashMap<>(4);
static {
map.put("car",new CarModels()) ;
map.put("fly",new FlyModels()) ;
map.put("flower",new FlowerModels()) ;
}
}
好了在类加载的时候我把不同的类型提前加载进去。就能保证你每次拿到是一样的了。
但是随着红娘生意越做越大被跨国巨头垂青,于是花重金收购。为了方便管理成立一个红娘工厂只要客户选择好咧类型。红娘工厂则会选出相应的红娘和相对应类型的妹子进行VIP服务这就是工厂方法
工厂方法:
public class FlowerModelFactory implements IMatchmakerFactory {
@Override
public IMatchmakers createGirl() {
return new FlowerModel();
}
}
public class CarModelFactory implements IMatchmakerFactory {
@Override
public IMatchmakers createGirl() {
return new CarModel() ;
}
}
public interface IMatchmakerFactory {
IMatchmakers createGirl();
}
public class MatchmakerFactory {
private static Map<String, IMatchmakerFactory> factory =
new HashMap<>();
static {
factory.put("card", new CarModelFactory());
factory.put("flower", new FlowerModelFactory());
}
public void iMatchmakers(String type) {
IMatchmakerFactory iMatchmakerFactory = factory.get(type);
IMatchmakers girl = iMatchmakerFactory.createGirl();
girl.meeting();
}
}
从上可以看出如果妹子类型增多只需要添加新的工厂类型即可。非常方便管理跨国公司不愧为跨国公司。那红娘呢只负责自己客户即可。看来我们都是螺丝钉。
随着Vip业务深入发展公司发现有钱人喜欢寻找真爱,姑娘们表示老娘也不是为了钱。于是成立了法律公正部在真爱结婚时做财产公正,这样也能提高公司收入。但是公司发现目前的结构很难符合需求于是决定成立
抽象工厂:
红娘事业部:
public interface IMatchmaker {
public void meeting();
}
public class CarModelImpl implements IMatchmaker {
@Override
public void meeting() {
System.out.println("我是红娘公司的漂亮车模");
}
}
public class FlowerImpl implements IMatchmaker {
@Override
public void meeting() {
System.out.println("我是如花");
}
}
婚姻公正事业部:
public interface IMarriage {
void LegalAdvice();
}
public class FlowerMarriageImpl implements IMarriage {
@Override
public void LegalAdvice() {
System.out.println("如花财产公正");
}
}
public class CarMarriageImpl implements IMarriage {
@Override
public void LegalAdvice() {
System.out.println("车模财产公正");
}
}
车模联合作战部:
public class CarModelFactory implements AbstractFactory {
@Override
public IMarriage createMarriage() {
return new CarMarriageImpl();
}
@Override
public IMatchmaker createMatchmaker() {
return new CarModelImpl();
}
}
如花联合作战部:
public class FlowerFactory implements AbstractFactory {
@Override
public IMarriage createMarriage() {
return new FlowerMarriageImpl();
}
@Override
public IMatchmaker createMatchmaker() {
return new FlowerImpl();
}
}
总指挥部:
public interface AbstractFactory {
IMarriage createMarriage();
IMatchmaker createMatchmaker();
}
如花实战:
public class Test {
public static void main(String[] args) {
FlowerFactory flowerFactory=new FlowerFactory();
flowerFactory.createMarriage().LegalAdvice();
flowerFactory.createMatchmaker().meeting();
}
}
工厂方法、抽象工厂区别:
工厂返回实体类实例,抽象工厂返回接口类型 这是从编程维度来说其实就是工厂方法只能负责自己部门的事而抽象工厂则是多个部门联合作战。
最后说下简单工厂这里:
其实我们大部分编程都在spring框架中那么就可以给实现同一个接口不同实现类 起不同的bean名字用的时候将其注入成一个map 如map(String,Interface) 通过名字取到相应的bean。 当然也可以拿到spring的上下文如ApplicationContext然后getBean也可以。
欢迎志同道合的同学加微信共同努力。也欢迎大佬写的不对的地方给与指正。