前提是对接口、抽象类、继承等概念熟悉
工厂设计模式
这种模式将创建对象的责任转移到工厂类。首先看一段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();
}
}
代理设计模式的主要特点是:一个接口提供有两个子类,其中一个子类是真实业务操作类,另一个是代理业务操作类,没有代理业务操作,真实业务无法进行(去食堂打饭,无人准备的话也就无饭可吃了)