看完了大话设计模式之后对工厂模式的理解就是总是分不清自己写的是什么工厂模式才烦人.
工厂模式分为3种,即简单工厂模式、工厂方法模式、抽象工厂模式,其实大同小异。
简单工厂模式: 是由一个工厂(注意是一个!)对象决定创建出哪一种产品类的实例。(想起昨天晚上看了刚更新的悍城13集郑泰诚说过的一句话:我是一个结果论至上的人)
工厂方法模式:定义一个用于创建对象的接口,让其子类决定实例化哪一个类。(工厂方法使一个类的实例化延迟到其子类)
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类(多个产品,多个工厂)
我的理解为:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
下面的优缺点是我对工厂方法模式的理解
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点: 每次增加一个产品时,都需要增加一个具体类和指定一个常量或枚举。
工厂方法模式是简单工厂模式的延伸因为简单工厂模式违反了开闭原则.所以拓展出了工厂方法模式.
/**
* Created by Light on 2018-10-18.
* 创建一个打电话功能工厂接口
*/
public interface PhoneIFactory {
// 接口里定义的只能是public的抽象实例方法
void Call();
}
/**
* Created by Light on 2018-10-18.
* 创建手机类实现打电话功能
*/
public class Mobilephone implements PhoneIFactory {
@Override
public void Call() {
System.out.println("我用手机打电话");
}
}
/**
* Created by Light on 2018-10-18.
* 创建智能手表类 实现打电话接口
*/
public class Wristwatch implements PhoneIFactory {
@Override
public void Call() {
System.out.println("我用手表打电话");
}
}
/**
* Created by Light on 2018-10-18.
* 个人建议工厂方法应该是静态方法或者采用单例模式
*/
public class FactoryMethod {
//创建常量是方便解耦合.当然也可以使用枚举;
public static final String IP_WRIST = Wristwatch.class.getName();
public static final String IP_MOBIL = Mobilephone.class.getName();
/**
* 利用反射来进行实例化
*
* 这样拓展就只需要添加工厂类和指定一个常量或枚举就好.无需改动Create函数
*
* @param type 使用常量方便解耦合
* @return T 省略类型强制转换,支持多态
*/
public static <T> T Create(String type) {
try {
return (T) Class.forName(type).getDeclaredConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
/**
* Created by Light on 2018-10-18.
* 客户端代码
* /
public class FactoryMethodTest {
public static void main(String[] args) {
//根据DP(迪米特法则)其实这里并不知道有一个什么类存在.可以使用常量或枚举;
PhoneIFactory iFactory = FactoryMethod.Create(FactoryMethod.IP_MOBIL);
Wristwatch wrist = FactoryMethod.Create(FactoryMethod.IP_WRIST);
iFactory.Call();
wrist.Call();
}
}
我想问一下这样会有什么不好吗?
而且这个模式是属于简单工厂模式还是方法工厂模式.
欢迎大家指点指点我.谢谢