工厂设计模式
先来看看一个代码:
/** 食物接口 */
interface IFood{
public void eat();
}
/** 米饭类,实现食物接口 */
class Rice implements IFood{
@Override
public void eat() {
System.out.println("吃米饭咯!");
}
}
public class Main {
public static void main(String[] args) {
IFood ifood = new Rice();
ifood.eat();
}
}
很简单的一段代码
但是客户端要明确知道具体的哪一个子类,如果说现在吃腻了米饭,改吃面条了,那么客户端就要做出修改
如下:
这种问题称之为“耦合问题”,是因为关键字“new ”造成了耦合问题
如何解决?
工厂(factory)设计实现
观察代码:
/** 食物接口 */
interface IFood{
public void eat();
}
/** 米饭类,实现食物接口 */
class Rice implements IFood{
@Override
public void eat() {
System.out.println("吃米饭咯!");
}
}
/** 面条类 */
class Noodle implements IFood{
@Override
public void eat() {
System.out.println("吃面条咯!");
}
}
/** 工厂设计 */
class Factory{
public IFood getDemo(String className){
if("rice".equals(className)){
return new Rice();
}
if("noodle".equals(className)){
return new Noodle();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
Factory factory = new Factory();
IFood food = factory.getDemo("noodle");
food.eat();
}
}
输出结果:
这样我们就成功地改吃面条了
翻篇了
代理设计模式(proxy):
作用:帮助用户将所有的开发注意力只集中在核心业务功能的
例如,肚子饿了,就只关注吃东西,不管吃啥
观察代码:
/** 吃接口 */
interface IEat{
public void get();
}
/** 代理设计 */
class eatProxy implements IEat{
private IEat eat;
/** 构造方法 */
public eatProxy(IEat eat){
this.eat = eat;
}
@Override
public void get() {
this.prepare();
this.eat.get();
this.clear();
}
/** 前期准备 */
public void prepare(){
System.out.println("【代理主题】:正在为您准备食材!");
System.out.println("【代理主题】:正在做菜!");
}
/** 后期收拾 */
public void clear(){
System.out.println("【代理主题】:正在收拾碗筷!");
}
}
/** 吃 */
class Eat implements IEat{
@Override
public void get() {
System.out.println("【真实主题】:得到了一顿饭!");
}
}
public class Main {
public static void main(String[] args) {
IEat iEat = new eatProxy(new Eat());
iEat.get();
}
}
运行结果:
我们可以发现,
代理设计模式的主要特点是:一个接口提供有两个子类,其中一个是真实的业务操作子类(只管吃),另一个是负责其他服务的代理子类(做饭、洗碗操作),真实业务在代理业务上进行,没有代理业务,真实业务无法进行
代码编译器:IntelliJ IDEA 2020.02