Java设计模式之工厂模式
一、简单工厂模式
简单工厂模式(Simple Factory Patterm):又称为静态工厂方法(Static Factory Method)模式,它属于类的创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
例如:DateFormart 类在获取实例的时候可以看到,在获取的参数不同时(在判断timeStyle datestyle)返回不同DateFormart的子类。这就是简单工厂模式的一个简单的应用。
public class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A"))
return new ProductA();
else
return new ProductB();
}//工厂,根据传入的参数不同,来判断创造什么实例
public static void main(String[] args) {
Product product = SimpleFactory.createProduct("A");
product.print();
}//测试主方法
}
abstract class Product{
public abstract void print();
}//一个抽象的产品类,是所有产品类的父类
class ProductA extends Product{
@Override
public void print() {
System.out.println("产品A");
}
}
class ProductB extends Product{
@Override
public void print() {
System.out.println("产品B");
}
}
//产品子类的具体实现
这里就是一个简单工厂的例子
优点:在实现对象的创建和使用时,完全把创建交给了工厂类来实例,更加的模块话。
缺点: 工厂类不够灵活,每新增一个产品就要去修改判断的条件。违背开闭原则。
二、工厂模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到子类。
在简单工厂模式中,我们如果新增一个产品就要修改工厂的类,这样导致维护与修改困难,且违背了Java开发的开闭原则,所以就有了工厂模式
工厂模式就是把一个具体对象的实例化交给了对应的子类工厂来做,
所以子新增一个产品时我们就直接新增一个产品的工厂。
例如:华为有一家生产手机的工厂,但是现在华为想生产耳机,是把原来手机的生产线改为耳机呢,还是建一个生产耳机的工厂呢。
明显再建一个工厂会更加的省事。
在jdk中Collection接口,通过LinkedList 或者ArrayList子工厂来创建对象,最后生产最终产品。
public class FactoryPattern {}
interface Phone{
void print();
}
//创建手机的接口
class iPhone implements Phone{
@Override
public void print() {
System.out.println("iphone");
}
}
//生产具体的实例
class HuaWeiPhone implements Phone{
@Override
public void print() {
System.out.println("HuaWeiPhone");
}
}
interface Factory{
Phone createPhone();
}
//工厂的接口
class IPhoneFactory implements Factory{
@Override
public Phone createPhone() {
return new iPhone();
}
}
//子工厂
class HuaWeiFactory implements Factory{
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
}
//子工厂
三、抽象工厂模式
抽象工厂模式与工厂模式的区别不大,只是在定义子工厂是,工厂更加的抽象,使得子工厂与成品并不是一一对应的关系。
注意:一旦新增新的产品体系就要回去修改工厂的逻辑结构。
如果抽象工厂模式一个工厂对应一个实例那么抽象工厂模式接等于工厂模式
抽象工厂模式也是违反开闭原则的。
public class abstractFactory {
}
//抽象的工厂
interface AbstractFactory{
Phone createPhone(String name);
Mask createMask(String name);
}
//具体的工厂
class SuperFactory implements AbstractFactory{
@Override
public Phone createPhone(String name) {
return new iPhone();
}
@Override
public Mask createMask(String name) {
return new N95();
}
}
//产品大类
interface Phone1{ }
class iPhone implements Phone1{ }
interface Mask1{ }
class N95 implements Mask1{ }
感谢阅读!!!!