创建型模式的作用就是创建对象,说到创建一个对象,最认识的就是 new 一个对象,然后 set 相关属性。但是,在许多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开辟者用的时候。
工厂模式分为简单工厂模式,工厂模式,抽象工厂模式
在工厂模式中,我们在创建对象时不会对客户端袒露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。本质就是使用工厂方法代替new操作。
简单工厂模式
public class FoodFactory {
public static Food makeFood(String name) {
if (name.equals("兰州拉面")) {
Food noodle = new LanZhouNoodle();
System.out.println("兰州拉面"+noodle+"出锅啦");
return noodle;
} else if (name.equals("黄焖鸡")) {
Food chicken = new HuangMenChicken();
System.out.println("黄焖鸡"+ chicken +"出锅啦");
return chicken;
} else {
System.out.println("不知道你做的什么哦~");
return null;
}
}
}
复制代码
此中,LanZhouNoodle 和 HuangMenChicken 都继续自 Food。
public class Cook {
public static void main(String[] args) {
Food food = FoodFactory.makeFood("黄焖鸡");
FoodFactory.makeFood("jaja");
}
}
复制代码
简单地说,简单工厂模式通常就是如许,一个工厂类 XxxFactory,内里有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。
我们强调职责单一原则,一个类只提供一种功能,FoodFactory 的功能就是只要负责生产各种 Food。
在此例中可以看出,Cook 类在使用 FoodFactory 时就不需要 new 任何一个对象,这就是简单工厂模式的好处,封装了 new 的部分,做到的代码易用性。
工厂模式
public class FoodServiceImpl implements FoodService {
@Override
public Food makeChicken() {
Food f = new Chicken();
f.setChicken("1kg");
f.setSpicy("1g");
f.setSalt("3g");
System.out.println("鸡肉加好佐料了");
return f;
}
}
复制代码
被代理实现类就只需要做自己该做的事情就好了,不需要管别的。
代理实现类:
public class FoodServiceProxy implements FoodService {
// 内部一定要有一个真实的实现类,当然也可以通过构造方法注入
private FoodService foodService = new FoodServiceImpl();
@Override
public Food makeChicken() {
System.out.println("开始制作鸡肉");
// 如果我们定义这句为核心代码的话,那么,核心代码是真实实现类做的,
// 代理只是在核心代码前后做些“无足轻重”的事情
Food food = foodService.makeChicken();
System.out.println("鸡肉制作完成啦,加点胡椒粉");
food.addCondiment("pepper");
System.out.println("上锅咯");
return food;
}
}
复制代码
客户端调用,留意,我们要用代理来实例化接口:
// 这里用代理类来实例化
FoodService foodService = new FoodServiceProxy();
foodService.makeChicken();
复制代码
所谓代理模式,就是对被代理方法包装大概叫加强, 在面向切面编程(AOP)中,着实就是动态代理的过程。好比 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before、@After、@Around 中的代码逻辑动态添加到代理中。
待续。。。
活动型模式