设计模式诞生的目的,我认为是可以使得写出的代码具有更好的逻辑性,减少了大量冗余代码来进行重复而繁琐的操作,也更好的提升了复用性。所以学习并且能够使用合理的设计模式可以让我们的代码更加美观,优雅,结构更加清晰。
一、简单工厂模式
平时创建对象的时候,一般使用New关键字来进行创建。
ClassAA aa = new ClassAA();
ClassBB bb = new ClassBB();
我们使用New关键字创建对象,会根据括号内的参数在构造函数里对实例化对象进行初始化。
然而,我们创建一个对象的时候,可能需要对他进行一些初始化操作,例如查询数据库,对属性赋值等等。如果我们把这些操作也全部写到构造函数中。那构造函数就变得很长很长,可读性大大降低。
针对这种情况,我们可以引入 ” 工厂 “ 的概念,我们不通过New关键字去创建对象了,我们直接去创建一个工厂,让工厂去帮我们创建对象。
例如,我们创建了一个专门生产手机的工厂,这个工厂可以生产梨子手机,菠萝手机。
那么首先我们要创建小米手机和锤子手机这两个类,这里我实现了一个Phone接口,表明小米手机和锤子手机都是一个 ” Phone “类型的类,然后我们在创建的时候返回Phone类型的就可以了。
public interface Phone {
void show();
}
public class XmPhone implements Phone {
@Override
public void show() {
System.out.println("我是小米手机");
}
}
public class CzPhone implements Phone {
@Override
public void show(){
System.out.println("我是锤子手机");
}
}
在创建个工厂手机,生成手机
public class PhoneFactory{
public Phone createPhone(Integer number) {
Phone phone = null;
if(number == 1){
phone = new XmPhone();
// .....
}else if(number == 2){
phone = new CzPhone();
// .....
}
return phone;
}
}
但是会出现一个问题,例如现在又要生成华为手机,就得修改手机工厂,违背了“开闭原则”。如何解决呢,就引到工厂模式
二、工厂方法模式
而工厂方法模式的主要原理就是,我们把每一个要创建的产品对象独立分配一个工厂,提取一个工厂接口出来,独立分配的工厂作为工厂接口的实现类,这样我们在创建工厂——再通过工厂创建对象的过程中,工厂就是唯一确定了的,所以创建的对象也是唯一确定的,不需要再使用过多的判断语句了。
所以我们对之前的工厂类进行修改先.
现在我们提取出了一个工厂接口,接口中有生产手机的方法,然后我们为梨子手机和菠萝手机都创建一个工厂类去实现接口,在实现类的 createPhone 方法中创建手机,这样如果我们以后有了其他手机,只需要再增加手机的工厂类去实现接口就可以了。
public interface PhoneFactory {
Phone createPhone();
}
public class XmFactory implements PhoneFactory{
@Override
public Phone createPhone() {
Phone phone = new XmPhone();
// .....
return phone;
}
}
public class CzFactory implements PhoneFactory{
@Override
public Phone createPhone() {
Phone phone = new CzPhone();
// .....
return phone;
}
}
三、测试
public class Test {
public static void main(String[] args) {
PhoneFactory factoryA = new XmFactory();
PhoneFactory factoryB = new CzFactory();
Phone phoneA = factoryA.createPhone();
Phone phoneB = factoryB.createPhone();
phoneA.show();
phoneB.show();
}
}
结果:
我是小米手机
我是锤子手机