Java设计模式之工厂模式、代理模式

前提是对接口、抽象类、继承等概念熟悉

工厂设计模式

这种模式将创建对象的责任转移到工厂类。首先看一段demo。

  • 传统实现方法:
package basis;
 
/**
 * @author lkh
 * @date 2020/7/28 22:35
 * @description 工厂设计模式
 */
 
public class FactoryDemo {
    public static void main(String[] args) {
        IFood food = new Bread();
        food.eat();//开始吃
    }
}
interface IFood{//定义一个食物标准
    public void eat();//吃
}
class Bread implements IFood{//定义一种食物
    @Override
    public void eat() {
        System.out.println("吃面包");
    }
}

分析:main()方法需要明确知道具体的子类!如果此时改为牛奶,那么main()方法就要做出相应的修改,此时程序就出现有耦合问题,而造成耦合最直接的元凶:“关键字new”。

  • 使用工厂设计模式:
package basis;
 
/**
 * @author lkh
 * @date 2020/7/28 22:35
 * @description 工厂设计模式
 */
 
public class FactoryDemo {
    public static void main(String[] args) {
        IFood food = Factory.getInstance("milk");//args[0]:执行该程序时的初始化参数——”java FactoryDemo bread“
        food.eat();//开始吃
    }
}
interface IFood {//定义一个食物标准
    public void eat();//吃
}
class Bread implements IFood {//定义一种食物
    @Override
    public void eat() {
        System.out.println("吃面包");
    }
}
class Milk implements IFood {//定义一种食物
    @Override
    public void eat() {
        System.out.println("喝牛奶");
    }
}
class Factory{
    public static IFood getInstance(String className){
        if ("bread".equals(className)){
            return new Bread();
        }else if ("milk".equals(className)){
            return new Milk();
        }else{
           return null;
        }
    }
}

参考https://www.runoob.com/w3cnote/factory-pattern.html

工厂模式的优点:

  • 面向接口编程,体现了面向对象的思想;
  • 将创建对象的工作转移到了工厂类;
  • 日后,若要进行子类扩充,只需要修改Factory类即可实现

JDK 中的工厂设计模式实例:

  • java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工厂方法模式;
  • valueOf() 在包装类中,如Boolean, Integer 也使用了工厂方法模式;

代理设计模式

代理设计模式的主要功能是可以帮助用户将所有的开发注意力只需要集中在核心业务功能的处理上
在这里插入图片描述

package basis;
 
/**
 * @author lkh
 * @date 2020/7/28 23:07
 * @description 代理设计模式
 */
 
public class ProxyDemo {
    public static void main(String[] args) {
        IEat eat = new EatProxy(new EatReal());
        eat.get();
    }
}
 
interface IEat{
    public void get();
}
class EatReal implements IEat{
    public void get(){
        System.out.println("【真实主题】:开始吃");
    }
}
 
class EatProxy implements IEat{ //服务代理
    private IEat eat;//为吃而服务
    public EatProxy(IEat eat){//一定要有个一个代理项
        this.eat = eat;
    }
    public void prepare(){//准备过程
        System.out.println("【代理主题】1、购买食材");
        System.out.println("【代理主题】2、处理食材");
    }
    public void clear(){
        System.out.println("【代理主题】3、收拾碗筷");
 
    }
 
    @Override
    public void get() {
        this.prepare();
        this.eat.get();
        this.clear();
    }
}

代理设计模式的主要特点是:一个接口提供有两个子类,其中一个子类是真实业务操作类,另一个是代理业务操作类,没有代理业务操作,真实业务无法进行(去食堂打饭,无人准备的话也就无饭可吃了)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值