目录
1. 简单工厂模式
又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式下,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类。
1.1 举例
jdk中的工具类DateFormat,根据参数的不同创建不同类的实例。
private static DateFormat get(LocaleProviderAdapter adapter, int timeStyle, int dateStyle, Locale loc) {
DateFormatProvider provider = adapter.getDateFormatProvider();
DateFormat dateFormat;
if (timeStyle == -1) {
dateFormat = provider.getDateInstance(dateStyle, loc);
} else {
if (dateStyle == -1) {
dateFormat = provider.getTimeInstance(timeStyle, loc);
} else {
dateFormat = provider.getDateTimeInstance(dateStyle, timeStyle, loc);
}
}
return dateFormat;
}
1.2 自定义实现一个简单工厂模式
public class SimpleFactory {
public static Product createProduct(String type){
if ("A".equals(type)){
return new A();
}else if("B".equals(type)){
return new B();
}else {
return null;
}
}
public static void main(String[] args) {
Product a = SimpleFactory.createProduct("A");
a.produce();
}
}
abstract class Product{
public abstract void produce();
}
class A extends Product{
@Override
public void produce() {
System.out.println("产品A被生产");
}
}
class B extends Product{
@Override
public void produce() {
System.out.println("产品B被生产");
}
}
1.3 优点
将对象的创建和使用分开,对象的创建交给工厂类,我们只需要去考虑如何使用。
1.4 缺点
违反了开闭原则【软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的】。当新增一个产品时需要修改原来的代码逻辑,不能灵活拓展。
2.工厂方法模式
2.1 举例
jdk中的集合类,如Collection为抽象工厂,LinkedList、ArrayList为具体的工厂,Iterator为抽象产品,ListItr、Itr为具体产品,它们分别由LinkedList、ArrayList生产。
2.2 自定义代码
对比上面类图来看,Collection相当于Factory;LinkedList、ArrayList相当于HuaWeiFatory、XiaoMiFactory;Iterator相当于Phone;ListItr、Itr相当于HuaWeiPhone、XiaoMiPhone。
public class FactoryMethod {
public static void main(String[] args) {
HuaWeiPhoneFactory huaWeiFactory = new HuaWeiPhoneFactory();
Phone phone = huaWeiFactory.createPhone();
phone.produce();
}
}
//公共的产品接口
interface Phone{
void produce();
};
//具体的产品华为手机
class HuaWeiPhone implements Phone{
@Override
public void produce() {
System.out.println("生产华为手机。");
}
};
//具体的产品小米手机
class XiaoMiPhone implements Phone{
@Override
public void produce() {
System.out.println("生产小米手机。");
}
};
interface PhoneFactory{
Phone createPhone();
};
class HuaWeiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
};
class XiaoMiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new XiaoMiPhone();
}
};
3.抽象工厂模式
在使用工厂方法模式创建一个产品的例子中,不管我们创建的HuaWeiPhone、XiaoMiPhone,它们都属于一个大类:Phone类。此处就体现除了工厂方法的局限性,假如这个工厂还要生产computer呢?又得重新弄一个工厂吗?其实抽象工厂模式就是工厂模式的一个拓展。如下示意图:
抽象工厂模式打破了工厂模式中工厂与产品大类的一对一的关系。一个工厂可以生产多个大类的产品。如湖南工厂既可以生产手机还可以生产电脑。
设计模式只是一种指导思想,我们应当根据实际的情况来选择合适的模式。