简单工厂模式(又叫静态工厂方法模式)
1.定义:
简单工厂模式,就是有一个具体的工厂类,它会按照你传递给它的参数给你产生一个对象。属于创建型设计模式。
2.优点:
使用工厂类会直接拿到一个可用的对象,你无需new一个对象。提高编程效率。
3.简单工厂模式的三个角色
简单工厂:工厂模式当然需要一个工厂,简单工厂负责实现创建所有实例的内部逻辑。使用时直接调用工厂类创建需要的对象。
抽象类:简单工厂创建的所有对象的父类,负责描述所有实例共有属性的公共接口。
具体对象:这个就是你工厂类创建的目标。
4.简单工厂的实现
以苹果手机生产为例,苹果公司就是简单工厂,抽象类定义苹果手机所共有的行为,具体对象就是IphoneX、Iphone11、Iphone12
首先定义苹果手机所共有的行为
public interface Iiphone {//抽象类
void call();//打电话
void watch();//看视频
}
定义具体对象实现Iiphone接口
public class IphoneX implements Iiphone {//具体对象
@Override
public void call() {
System.out.println("用IphoneX打电话");
}
@Override
public void watch() {
System.out.println("用IphoneX看电视");
}
}
public class Iphone11 implements Iiphone {
@Override
public void call() {
System.out.println("用Iphone11打电话");
}
@Override
public void watch() {
System.out.println("用Iphon11看电视");
}
}
public class Iphone12 implements Iiphone {
@Override
public void call() {
System.out.println("用Iphone12打电话");
}
@Override
public void watch() {
System.out.println("用Iphone12看电视");
}
}
设计简单工厂(这里写了三种简单工厂的实现)
public class SimpleFactory {//简单工厂
/**
* 这种方式随着产品越来越多会添加更多的case也就是处理逻辑也会越来越多
* @param kind
* @return
*/
public static Iiphone makeIphone(String kind) {
switch (kind) {
case "X":
return new IphoneX();
case "11":
return new Iphone11();
case "12":
return new Iphone12();
}
return null;
}
/**
* 直接提供对象的全类名,通过反射获取实例。解决了上述问题
* 但该方式传入的值是字符串,使用不方便
* @param className
* @return
*/
public static Iiphone makeIphoneByClassName(String className) {
try {
if(!(className==null||"".equals(className))) {
Iiphone iphone = (Iiphone) Class.forName(className).newInstance();
return iphone;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 直接传入class对象 解决上述问题
* @param classed
* @return
*/
public static Iiphone makeIphoneByClass(Class <? extends Iiphone> classed) {
try {
Iiphone iphone = classed.newInstance();
return iphone;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
分别使用三种工厂产生一个iPhone对象
public class Client {
public static void main(String[] args) {
Iiphone iphoneX = SimpleFactory.makeIphone("X");//从工厂获取一个iphoneX对象
Iiphone iphone11 = SimpleFactory.makeIphoneByClassName("cn.csdn.iphone.bean.impl.Iphone11");//从工厂获取一个iphone11对象
Iiphone iphone12 = SimpleFactory.makeIphoneByClass(Iphone12.class);//从工厂获取一个iphone12对象
iphoneX.call();
iphone11.call();
iphone12.call();
}
}
控制台输出