简单工厂模式
1.简单工厂模式简介
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
看百度的介绍,不好理解。我的理解是:
简单工厂模式专门定义一个类来更具传入的参数来创建其他的不同类的实例,被创建的实例通都有共同的父类。
2.简单工厂模式的代码实现
我们使用汽车启动的实例来阐述,假设我们有一辆兰博基尼,现在我们又拥有了法拉利和科尼塞克。这个时候,我们需要一个类来决定每天开什么。下面运用简单工厂来实现。
第一步
创建一个汽车接口,他有一个抽象方法用于启动汽车
Car.java
public interface Car {
public void start();
}
第二步
创建Car接口的实现类,他们都继承了他们的父类Car,并实现了父类的start方法。
Lamborghini .java
public class Lamborghini implements Car {
@Override
public void start() {
System.out.println("兰博基尼启动!");
}
}
Ferrari .java
public class Ferrari implements Car {
@Override
public void start() {
System.out.println("法拉利启动!");
}
}
Koenigsegg .java
public class Koenigsegg implements Car {
@Override
public void start() {
System.out.println("科尼塞克启动!");
}
}
第三步
创建工厂类,提供getCar方法用来得到相应的汽车类对象。你只需要传入你想开的汽车的品牌,他就会实例化出相应的实例。
CarFactory .java
public class CarFactory {
public Car getCar(String carType){
if(carType==null){
return null;
}
switch (carType) {
case "兰博基尼":
return new Lamborghini();
case "法拉利":
return new Ferrari();
case "科尼塞克":
return new Koenigsegg();
default:
return null;
}
}
}
第四步
客户端调用工厂类,传入相应的参数,启动相对应的汽车。
StartCar .java
public class StartCar {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
//调用兰博基尼方法
carFactory.getCar("兰博基尼").start();
//调用法拉利方法
carFactory.getCar("法拉利").start();
//调用科尼塞克方法
carFactory.getCar("科尼塞克").start();
}
}
第五步
运行代码,查看结果。
3.优缺点
优点
- 扩展性高,如果想增加一个功能,只要扩展一个工厂类就可以。
- 复用性高:封装好的工厂类可以在各个地方使用。
- 安全性高:屏蔽了功能的具体实现,调用者只需要关心功能的接口即可。
- 灵活性高:根据客户端提供的参数,工厂类可以创建相应的对。客户端只需要使用对象即可,而不用去管对象是如何创建的。明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
1.每调用一次功能就会实例化一个对象,调用次数多了,对象就多了,一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
2.工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;
4.适用场景
1.工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
2.客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
注:由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
5.总结
编程其实是一门艺术,我们不能只满足代码能正常运行就完事了,要想办法优化这个代码,让他变的更简洁,更容易维护,增加代码的复用性。只有这样,技术才会得到真正的提高。当做到的时候,你会发现,写出优雅的,漂亮的代码是一件快乐的一批的事情。
实例(计算器)
接口代码
public interface Calculater {
public double count(double numA,double numB);
}
加减乘除接口实现类
//加法接口实现类
public class CalculaterAdd implements Calculater {
@Override
public double count(double numA,double numB) {
return numA+numB;
}
}
//减法接口实现类
public class CalculaterSub implements Calculater {
@Override
public double count(double numA, double numB) {
return numA-numB;
}
}
//乘法接口实现类
public class CalculaterMul implements Calculater {
@Override
public double count(double numA,double numB) {
return numA*numB;
}
}
//除法接口实现类
public class CalculaterExc implements Calculater {
@Override
public double count(double numA, double numB) {
return numA/numB;
}
}
工厂实例类
public class CreateCalculater {
public static Calculater getCalculater(String calclaterType){
Calculater calculater = null;
switch (calclaterType){
case "+":
calculater = new CalculaterAdd();
break;
case "-":
calculater = new CalculaterSub();
break;
case "*":
calculater = new CalculaterMul();
break;
case "/":
calculater = new CalculaterExc();
break;
}
return calculater;
}
}
客户端代码
public class Count {
public static void main(String[] args) {
Calculater calculater=null;
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("***********************************************");
System.out.print("请输入运算符号(+,-,*,/):");
String calclaterType = scanner.next();
calculater = CreateCalculater.getCalculater(calclaterType);
System.out.print("请输入数字A:");
double numA =scanner.nextDouble();
System.out.print("请输入数字B:");
double numB = scanner.nextDouble();
System.out.println("结果是:"+calculater.count(numA,numB));
System.out.print("是否继续(x/y):");
String bol = scanner.next();
if (bol.equals("y"))
break;
}
}
}