学习笔记——JAVA设计模式<2>工厂模式

工厂模式
实现了创建者和调用者的分离
详细分类
简单工厂模式
工厂方法模式
抽象工厂模式
面向对象设计的基本原则
OCP(开闭原则 Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭
DIP(依赖倒转原则 Dependence Inversion Principle):要针对接口编程,不要针对实现编程
LoD(迪米特法则 Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信

核心本质
实例化对象,用工厂方法代替new操作
将实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

工厂模式
简单工厂模式
用来生产同一等级结构中的任意产品(对于增加的产品,需要修改已有代码)
工厂方法模式
用来生产同一等级结构的固定产品(支持增加任意产品)
抽象工厂模式
用来生产不同产品族的全部产品(对于增加的新产品,无能为力,支持增加产品族)

简单工厂运用最多
简单工厂模式也叫静态工厂模式,就是工厂类一般使用是静态方法,通过接收的参数的不同来返回不同的对象实例
对于增加新的产品,不修改代码,是无法拓展的

package studyGFO;
/**
 * 简单工厂
 * @author http://blog.csdn.net/thewaiting
 *
 */
public class Fatory {
    //1
    public static FactoryDome01 createMethon(String type) {
        if ("FactoryDome02".equals(type)) {
            return new FactoryDome02();
        }else if("FactoryDome03".equals(type)){
            return new FactoryDome03();
        }
        return null;
    }
    //2
    public FactoryDome02 cteateFactoryDome02() {
        return new FactoryDome02();
    }
    public FactoryDome03 cteateFactoryDome03() {
        return new FactoryDome03();
    }

}
package studyGFO;
/**
 * 简单工厂模式使用
 * @author http://blog.csdn.net/thewaiting
 *
 */
public class Client {//调用者

    public static void main(String[] args) {
        FactoryDome01 f2 = Fatory.createMethon("FactoryDome02");
        FactoryDome01 f3 = Fatory.createMethon("FactoryDome03");

        f2.run();

    }

}
package studyGFO;

public interface FactoryDome01 {
    void run();
}
package studyGFO;

public class FactoryDome02 implements FactoryDome01{

    @Override
    public void run() {
        System.out.println("这里是FactoryDome02");
    }

}
package studyGFO;

public class FactoryDome03 implements FactoryDome01{

    @Override
    public void run() {
        System.out.println("这里是FactoryDome03");

    }



}

工厂方法模式
为了避免简单工厂的缺点,不完全满足OCP(开闭原则)
工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立的模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类
增加新的类 类多了

修改代码

package studyGFO;
/**
 * 工厂方法模式  符合开闭原则
 * @author http://blog.csdn.net/thewaiting
 *
 */
public class Client {//调用者

    public static void main(String[] args) {
        FactoryDome01 f2 = new FD2Factory().createFactory();
        FactoryDome01 f3 = new FD3Factory().createFactory();
        f2.run();
        f3.run();
    }

}
package studyGFO;
/**
 * 工厂方法模式
 * @author http://blog.csdn.net/thewaiting
 *
 */
public interface Factory {
    FactoryDome01 createFactory();
}
package studyGFO;
/**
 * 想增加新的产品就new一个这样新的类不用修改原有的代码

 * @author http://blog.csdn.net/thewaiting
 *
 */
public class FD2Factory implements Factory{

    @Override
    public FactoryDome01 createFactory() {
        return new FactoryDome02();
    }

}

package studyGFO;

public class FD3Factory implements Factory{

    @Override
    public FactoryDome01 createFactory() {  
        return new FactoryDome03();
    }

}

抽象工厂模式
用来生产不同产品族的全部产品(对于新增的产品,无能为力;支持增加产品族
抽象工厂模式是工厂模式的升级版本,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式

package studyGFO;

public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
    Tyre createTyre();
}


package studyGFO;

public class LowCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {

        return new LowEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowSeat();
    }

    @Override
    public Tyre createTyre() {

        return new LowTyre();
    }

}
package studyGFO;

public class LuxuryCarFactory implements CarFactory{

    @Override
    public Engine createEngine() {

        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {

        return new LuxurySeat();        
    }

    @Override
    public Tyre createTyre() {

        return new LuxuryTyre();
    }

}
package studyGFO;

public interface Engine {

    void run();
    void start();
}

class LuxuryEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转速快");

    }

    @Override
    public void start() {   
        System.out.println("启动快");
    }

}

class LowEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转速慢");

    }

    @Override
    public void start() {   
        System.out.println("启动慢");
    }

}
package studyGFO;

public interface Seat {

    void massage();
}
class LuxurySeat implements Seat{

    @Override
    public void massage() {
        System.out.println("能按摩");

    }
}
class LowSeat implements Seat{

    @Override
    public void massage() {
        System.out.println("不能按摩");

    }
}
package studyGFO;

public interface Tyre {
    void revolve();

}

class LuxuryTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("磨损轻微");
    }

}

class LowTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("磨损严重");
    }

}
package studyGFO;

public class Client {

    public static void main(String[] args) {
        CarFactory factory = new LuxuryCarFactory();
        Engine engine = factory.createEngine();
        engine.run();
    }

}

工厂模式要点
简单工厂模式(静态工厂模式)
虽然某种程度上不符合设计原则,但实际使用最多
工厂方法模式
不修改已有类的前提下,通过新增的工厂类实现扩展
抽象工厂模式
不可以增加产品,可以增加产品族

应用场景
JDK中Calendar的getInstance方法
JDBC中Connection对象的获取
Hibernate中SessionFactory创建Session
Spring中IOC容器创建管理bean对象
XML解析时的DocunentBuilderFactory创建解析器对象
反射中Class对象的呢我Instance()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值