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