MENU

工厂设计模式与代理设计模式

• November 18, 2020 • 面向对象编程

工厂设计模式

先来看看一个代码:

/** 食物接口 */
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

Archives QR Code Tip
QR Code for this page
Tipping QR Code