一、什么是简单工厂模式。
简单工厂模式又称为静态工厂,实质是创建一个工厂类,由我们传入参数(可以是属性,可以是样式,也可以是类型),由工厂类动态的去创建对应属性的对象,然后返回给我们,简单的说就是对象的样式或属性由我们自己决定,而创建对象的过程由工厂类帮我们执行,简单工厂模式不属于23中设计模式的一种,但是在实际开发中会经常用到的一种思想。
二、简单工厂模式的结构。
简单工厂模式包含下面三个角色:
1:工厂角色:它是简单工厂模式的核心,负责选择创建产品实例,可以直接被外部调用。(我觉得它可以算作是一个选择器,根据我们传参的内容去判断选择创建哪种实例)。
2:抽象产品角色:是所有具体产品角色的父类,他是负责描述所有实例的公共接口。
3:具体产品角色:继承抽象产品角色,是经过选择器选择后我们需要创建的目标实例,返回我们需要的具体类型的实例。
可以理解为父类就是我们需要的实例的一个比较大的分类比如说苹果手机,具体产品角色可以理解为大分类下面的具体的小分类比如说苹果4S 5S 6S 7S 8S 等等。假设在买手机的时候,我们需要先定位自己买什么牌子的手机,在定位买什么型号的手机,然后我们直接跟店家说牌子和型号,他就把我们想要的手机给我们了,而店家就是扮演工厂角色,作为一个类似于选择器的存在,简单工厂模式最契合的就是面向对象的多态思想。(比较啰嗦)
三、简单工厂模式的优缺点。
优点:工厂类是整个模式的关键,包含了必要的逻辑判断,根据传入的参数信息来决定具体创建哪个实现类的对象,完全摆脱了我们手动创建对象而且还需要设置具体的参数属性的的尴尬局面,更有利于日后的扩展有利于整个项目结构的优化。
缺点:简单工厂模式违背了开闭原则(对扩展开发,对更改封闭),我们需要将全部的逻辑集中到工厂类中,工厂类可以创建的实例都是我们事先想好的,提前加入的实现类,比如我的工厂类中有苹果4S 5S 6S 7S 但是我想买8S怎么办?这样我就需要在父类下面在定义个8S的具体实现类,很麻烦,当我们需求不断增加的时候,(比如我想要9S 10S 11S X XS)等等未知型号的,我们就需要加入未知个数的实现类,所以这时候简单工厂模式显然已经不能满足我们的需求了。
四、代码
//苹果牌子的手机
public abstract class Iphone{
//获取型号
protected abstract void getModel();
}
//一号实现类
public class IphoneX extend Iphone{
public void getModel() {
System.out.println("iPhoneX屏幕:3.5英寸");
}
}
//二号实现类
public class IphoneX extend Iphone{
public void getModel() {
System.out.println("iPhoneXS屏幕:4.5英寸");
}
}
//三号实现类
public class IphoneX extend Iphone{
public void getModel() {
System.out.println("iPhoneXR屏幕:5.5英寸");
}
}
以上是我们在业务需求开始之前加入的实现类。
//苹果工厂(选择器)
public class IPhoneFactory {
public static IPhone createPhone(String model){
IPhone phone = null;
switch (model) {
case"iPhoneX":
phone = new IphoneX();
break;
case"iPhoneXs":
phone = new IphoneXs();
break;
case"iPhoneXr":
phone = new IphoneXR();
break;
default:
break;
}
return phone;
}
}
接下来我们在main方法中测试一下
//传入我们想要的型号
public class Client {
public static void main(String[] args) {
IPhone iphone ;
iphone = IPhoneFactory.createPhone("iPhoneX");
iphone .getModel();
iphone = IPhoneFactory.createPhone("iPhoneXs");
iphone .getModel();
iphone = IPhoneFactory.createPhone("iPhoneXr");
iphone .getModel();
}
}
五、总结
简单工厂模式就是把创建对象的过程进行了抽象化处理,是对象的创建过程与使用过程分离,我们只负责使用对象不负责创建对象,简单工厂模式只适用于负责创建的对象比较少的情况,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。