2021-01-30 工厂模式&&UML类图

UML类图1
UML类图2
UML类图3

1开放封闭原则

  • 对修改关闭,对扩展开放。
  • 香港回归一国两制。
  • 对痛苦关闭,对快乐开放。

2简单工厂和工厂的对比

  • 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。就像计算器,让客户端不用管该用哪个类的实例,只有把“+”给工厂,工厂就自动给出了相应的实例,客户端只要去做运算就可以。不用的实例会实现不同的运算。
    但是问题也就在这里,如果要加一个“求M数的N次方”的功能,我们是一定要给运算工厂类的方法里加“case”的分支条件的,修改原有的类?这可不是什么好方法,这就等于说,我们不但对扩展开放了,对修改也开放了。违背了开放-封闭原则。
    于是工厂方法就来了。
    工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使以子类的实例化延迟到其子类

3工厂模式图

2021-01-30 工厂模式&&UML类图_第1张图片
工厂.png

2021-01-30 工厂模式&&UML类图_第2张图片
工厂原型图.png

4学雷锋简单工厂

class LeiFeng {
   public void Sweep() {
       System.out.println("扫地");
   }
   public void Wash() {
       System.out.println("洗衣");
   }
   public void CarryRice() {
       System.out.println("扛大米");
   }
   public void SayHello() {
       
   }
}
class Volunteer extends LeiFeng {
   public void SayHello() {
       System.out.println("志愿者学雷锋");   
   }
}
class Undergraduate extends LeiFeng {
   public void SayHello() {
       System.out.println("大学生学雷锋");   
   }
}
// 简单雷锋工厂
class SimpleFactory {
   public static LeiFeng CreateLeiFeng(String type) {
       LeiFeng result = null;
       switch (type) {
           case "学雷锋的大学生":
               result = new Undergraduate();
               break;
           case "社区志愿者":
               result = new Volunteer();
               break;
       }
       return result;
   }
}
public class LeiFengEgg {
   public static void main(String[] args) {
       LeiFeng person = SimpleFactory.CreateLeiFeng("学雷锋的大学生");
       person.SayHello();
       person.Wash();
       LeiFeng personB = SimpleFactory.CreateLeiFeng("社区志愿者");
       personB.SayHello();
       personB.CarryRice();
   }
}

5学雷锋工厂

interface IFactory {
    LeiFeng CreateLeiFeng();
}
class LeiFeng {
    public void Sweep() {
        System.out.println("扫地");
    }
    public void Wash() {
        System.out.println("洗衣服");
    }
    public void CarrayRice() {
        System.out.println("扛大米");
    } 
    public void SayHello() {
    } 
}
class Undergraduate extends LeiFeng {
    public void SayHello() {
        System.out.println("我是大学生,我来学雷锋");
    } 
}
class Volunteer extends LeiFeng {
    public void SayHello() {
        System.out.println("我是志愿者,我来学雷锋");
    } 
}
class UndergraduateFactory implements IFactory {
    public LeiFeng CreateLeiFeng() {
        return new Undergraduate();
    }
}
class VolunteerFactory implements IFactory {
    public LeiFeng CreateLeiFeng() {
        return new Volunteer();
    }
}
public class LeiFengF {
    public static void main(String[] args) {
        IFactory factory = new UndergraduateFactory();
        LeiFeng leifengA = factory.CreateLeiFeng();
        leifengA.SayHello();
        leifengA.CarrayRice();
        IFactory factoryB = new VolunteerFactory();
        LeiFeng leifengB = factoryB.CreateLeiFeng();
        leifengB.SayHello();
        leifengB.Wash();
    }
}

你可能感兴趣的:(2021-01-30 工厂模式&&UML类图)