工厂模式
作用:实现了创建者和调用者的分离
核心本质:
- 实例化对象不能使用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦
详细分类:
-
-
-
简单工厂模式
-
- 用来生产同一等级结构中的任意产品
-
工厂方法模式
-
- 用来生产同一等级结构中的固定产品
-
抽象工厂模式
-
- 胃药一个超级工厂创建其他工厂
-
-
需要满足的OOP原则:
- 开闭原则:一个软件的实体类应当对扩展开放,对修改关闭。
- 依赖倒转原则:要针对接口编程,不要针对实现编程。
- 迪米特法则:只与你直接的朋友通信,而避免和陌生人通信。
代码场景:根据消费者需求创建不同厂商的车
实现步骤:
1.创建一个车的接口
public interface Car{
void name; // 车品牌名称
}
2.创建实现车这个接口的车品牌商
public class Audi implements Car{
public void name(){
System.out.println("奥迪汽车");
}
}
public class BMW implements Car{
public void name(){
System.out.println("宝马汽车");
}
}
public class Mercedes implements Car{
public void name(){
System.out.println("奔驰汽车");
}
}
不使用工厂模式下:
创建消费者消费
public class Consumer{
public static void main(String [] args){
// 有用户来创建汽车
Car c1 = new Audi();
Car c2 = new BMW();
Car c3 = new Mercedes();
c1.name();
c2.name();
c3.name();
}
}
简单工厂模式:
创建车厂
public class Carmaker{
public static Car getCar(String name) throws Exception{
// 由车厂创建车辆
//通过车名 来判断用户需要的那个品牌的车
if(name == "奥迪"){return new Audi();}
else if(name == "宝马"){return new BMW();}
else if(name == "宝马"){return new Mercedes();}
else{throw new Exception("您需要的车不存在")}
}
}
创建消费者
public class Consumer{
public static void main(String [] args){
// 用户调用通过工厂获得汽车
Car audi = Carmaker.getCar("奥迪");
Car bmw = Carmaker.getCar("宝马");
Car mercedes = Carmaker.getCar("奔驰");
audi.name();
bmw.name();
mercedes.name();
}
}
简单工厂模式缺点:不满足OOP种的开闭原则,若添加新的车种这能修改车厂。
简单工厂模式优点:结构复杂度低,代码简单,易编程,易管理。
工厂方法模式:
工厂方法模式与简单工厂模式不同之处就是把创造每个对象的工厂进行分离,耦每一个工厂生产固定类的对象,相对简单工厂模式,工厂方法模式要更为复杂。
创建一个工厂类的接口
public interface Factory{
Car getCar();
}
分别给不同类创建各自的工厂
public class AudiFactory implements Factory{
public Car getCar(){
return new Audi();
}
}
public class BMWFactory implements Factory{
public Car getCar(){
return new BMW();
}
}
public class MercedesFactory implements Factory{
public Car getCar(){
return new Mercedes();
}
}
创建消费者
public class Consumer {
public static void main(String[] args) {
// 消费者根据需求去各自的工厂获取对象
Car audi = new AudiFactory().getCar();
Car bmw = new BMWFactory().getCar();
Car mercedes = new MercedesFactory().getCar();
audi.name();
bmw.name();
mercedes.name();
}
}
感谢阅读
欢迎留言