• JAVA设计模式工厂模式


    工厂模式:

    – 实现了创建者和调用者的分离。

    – 详细分类: • 简单工厂模式 • 工厂方法模式 • 抽象工厂模式
    • 面向对象设计的基本原则:

    – OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开 放,对修改关闭。

    DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程, 不要针对实现编程。

    LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和 陌生人通信。

    核心本质:

    – 实例化对象,用工厂方法代替new操作。

    – 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实 现类解耦。
    • 工厂模式:

    – 简单工厂模式 • 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已 有代码)

    – 工厂方法模式 • 用来生产同一等级结构中的固定产品。(支持增加任意产品)

    – 抽象工厂模式 • 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持 增加产品族)

    简单工厂模式 

    要点: – 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法, 通过接收的参数的不同来返回不同的对象实例。

    – 对于增加新产品无能为力!不修改代码的话,是无法扩展的。

    //简单工厂
    public class CarFactory {
    //     public static Car createCar(String type){
    //    	 if("奥迪".equals(type)){
    //    		 return new Audi();
    //    	 }else if("比亚迪".equals(type)){
    //    		 return new Byd();
    //    	 }else{
    //    		 return null;
    //    	 }
    //     }
    	public static Car createAudi(){
    		return new Audi();
    	}
    	public static Car createByd(){
    		return new Byd();
    	}
    }
    

      

    public interface Car {
        void run();
    }
    

     

    public class Byd implements Car{
    	@Override
    	public void run(){
    		System.out.println("比亚迪再跑");
    	}
    }
    

      

    public class Audi implements Car {
    	@Override
    	public void run() {
    		System.out.println("奥迪再跑");
    	}
    }
    

      工厂方法模式要点:

    – 为了避免简单工厂模式的缺点,不完全满足OCP。

    – 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目 或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

    • 简单工厂模式和工厂方法模式PK:

    – 结构复杂度 从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个 数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。

    – 代码复杂度 

    代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法 模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工 厂类只完成单一任务,代码简洁。 

    客户端编程难度

    工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简 单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。

    – 工厂方法模式完全满足OCP,即它有非常良好的扩展性。那是否就说明了简单工厂模式就 没有扩展性呢?答案是否定的。简单工厂模式同样具备良好的扩展性——扩展的时候仅需要修改少量的代码(修改工 厂类的代码)就可以满足扩展性的要求了。反而简单工厂没有这些 麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类(无论怎样都能改到满足要求吧?大 不了把这个类重写)。 

     抽象工厂模式

    – 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力; 支持增加产品族)

    – 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务 分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

      工厂模式要点:

    – 简单工厂模式(静态工厂模式)

    •虽然某种程度不符合设计原则,但实际使用最多。

    – 工厂方法模式

    • 不修改已有类的前提下,通过增加新的工厂类实现扩展。

    – 抽象工厂模式 • 不可以增加产品,可以增加产品族!

    • 应用场景 – JDK中Calendar的getInstance方法

    – JDBC中Connection对象的获取

    – Hibernate中SessionFactory创建Session

    – spring中IOC容器创建管理bean对象

    – XML解析时的DocumentBuilderFactory创建解析器对象

    – 反射中Class对象的newInstance()

    public interface Engine {
        void run();
        void start();
    }
    class LowEngine implements Engine{
    
    	@Override
    	public void run() {
    		System.out.println("转的慢");
    	}
    
    	@Override
    	public void start() {
    	System.out.println("启动的慢");
    	}	
    }
    class LuxuryEngine implements Engine{
    
    	@Override
    	public void run() {
    		System.out.println("转的快");
    	}
    
    	@Override
    	public void start() {
    	System.out.println("启动的快");
    	}	
    }
    

      

    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("不可以自动按摩");
    	}
    }
    

      

    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("旋转磨损快!");
    	}
    }
    

      

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

      

    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();
    	}
    }
    

      

    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();
    	}
    
    }
    

      

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

      建造者模式:

    开发中应用场景:

    – StringBuilder类的append方法

    – SQL中的PreparedStatement

    – JDOM中,DomBuilder、SAXBuilder

    public class AirShip {
    	private OrbitalModule orbitalModule;
    	private Engine engine;
    	private EscapeTower escapeTower;
    	
    	public void launch(){
    		System.out.println("点火");
    	}
    	
    	public OrbitalModule getOrbitalModule() {
    		return orbitalModule;
    	}
    	public void setOrbitalModule(OrbitalModule orbitalModule) {
    		this.orbitalModule = orbitalModule;
    	}
    	public Engine getEngine() {
    		return engine;
    	}
    	public void setEngine(Engine engine) {
    		this.engine = engine;
    	}
    	public EscapeTower getEscapeTower() {
    		return escapeTower;
    	}
    	public void setEscapeTower(EscapeTower escapeTower) {
    		this.escapeTower = escapeTower;
    	}
    }
    class OrbitalModule{
    	private String name;
    	public OrbitalModule(String name){
    		super();
    		this.name=name;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    class Engine{
    	private  String name;
    	public Engine(String name){
    		super();
    		this.name=name;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}	
    }
    class EscapeTower{
    	private String name;
    	public EscapeTower(String name){
    		super();
    		this.name=name;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

      

    public interface AirShipBuilder {
        Engine builderEngine();
        OrbitalModule builderOrbitalModule();
        EscapeTower builderEscapeTower();
    }
    

      

    public interface AirShipDirector {
    	AirShip directAirShip();// 組裝
    }
    

      

    public class LaoShiAirshipDirector implements AirShipDirector {
    	private AirShipBuilder builder;
    	public LaoShiAirshipDirector(AirShipBuilder builder){
    		this.builder=builder;
    	}
    	@Override
    	public AirShip directAirShip() {
    		Engine e=builder.builderEngine();
    		EscapeTower et=builder.builderEscapeTower();
    		OrbitalModule o= builder.builderOrbitalModule();
    		
    		AirShip ship=new AirShip();
    		ship.setEngine(e);
    		ship.setEscapeTower(et);
    		ship.setOrbitalModule(o);
    		return ship;
    	}
    }
    

      

    public class LsoShiAirShipBuilder implements AirShipBuilder{
    
    	@Override
    	public Engine builderEngine() {
    		System.out.println("老石发动机");
    		return new Engine("老石");
    	}
    
    	@Override
    	public OrbitalModule builderOrbitalModule() {
    	System.out.println("构建轨道车");
    		return new OrbitalModule("轨道车");
    	}
    
    	@Override
    	public EscapeTower builderEscapeTower() {
    		System.out.println("构建天意达");
    		return new EscapeTower("跳台");
    	}
    }
    

      

    public class Client {
    	public static void main(String[] args) {
    		AirShipDirector director = new LaoShiAirshipDirector(new LsoShiAirShipBuilder());
            AirShip ship=director.directAirShip();
            System.out.println(ship.getEngine().getName());
            
            ship.launch();
    	}
    }
    

      

  • 相关阅读:
    C# Bitmap类型与Byte[]类型相互转化
    博客园添加个人Github链接
    C# Exception has been thrown by the target of an invocation(调用的目标已抛出异常) 解决办法
    C# 使用Renci.SshNet连接SSH远程服务器
    Oracle 查询当前数据库版本信息
    Oracle ORA-12569: TNS:包校验和失败
    Oracle Rollup()函数
    Oracle 字符串补零
    DataGridView 表格排序后颜色丢失
    DataGridView 实现最后一列的宽度自适应
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/11853301.html
Copyright © 2020-2023  润新知