设计模式----工厂模式

1.设计模式简介

       GoF23(23种设计模式)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,它不是语法规定,而是用来提高代码的可复用性,可维护性,可读性稳健性以及安全性的解决方案。设计模式的本质是面向对象设计原则的实际运用。是对类的封装,继承,多态以及类的关联关系和组合关系的充分理解。可以提高程序员的思维能力,编程能力里和设计能力,使程序设计更加标准化,代码编制更加工程化,提升效率,缩短开发周期。使开发的产品安全性更高,可维护性更强,可用性更高,重点是理解思想与应用场景。

2.常见设计模式:

创建性模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。

结构性模式:适配器模式,桥接模式,代理模式。

行为性模式:观察者模式,职责链模式。

3.OOP七大原则

开闭原则:对扩展开放,对修改关闭。

里氏替换原则:继承必须确保父类所拥有的性质在子类中仍然成立,意思:子类中尽量添加新的方法完成新的功能,尽量不要重写父类的方法,少使用多态。

依赖倒置原则:要面向接口编程,不要面向实现编程,细节依赖抽象,而不是抽象依赖细节。

单一职业原则:一个对象不应该承担太多的职业,一个方法尽量做好一件事情就行。

接口隔离原则:要为各个类建立它们需要的专用接口。

迪米特法则:只与你的朋友交谈,不跟陌生人交谈,但是需要增加一些中间类,增加系统的复杂性。

合成复用原则:尽量使用has a等组合关联关系实现,其次考虑is a继承关系来实现。

4.工厂模式介绍

工厂模式:Factory。创建者和调用者分离:简单工厂模式,工厂方法模式,抽象工厂模式。遵守迪米特法则,开闭原则,依赖倒置原则。实例化对象不使用new,用工厂方法代替。将调用者和实现类进行解耦。让调用者(消费者)不用管底层的实现,直接面向工厂拿对象就行。

4.1简单工厂模式

用来生产同一等级结构中的任意产品。简单工厂模式虽然满足大部分功能,但如果增加了新的接口的实现类,需要修改静态工厂里面的代码,违反开闭原则。

4.2工厂方法模式

用来生产同一等级结构中的固定产品。即创建一个工程方法接口(工厂接口里面有一个返回对象的方法),然后给每一个具体的实现类增加一个工厂类,这个工厂类实现工厂接口,然后通过这个实现类的工厂类去拿到相应的对象。但是会增加大量的代码量。

5.简单工厂与复杂工厂模式代码演示

Car接口

package factory.simple;

/**
 * @author Clay
 *
 */
public interface Car {
	
	void name();
	
}

 Car接口的两个实现类

package factory.simple;

public class BMW implements Car {

	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("BMW");
	}

}
package factory.simple;

public class WuLing implements Car {

	@Override
	public void name() {
		// TODO Auto-generated method stub
		System.out.println("五菱宏光");
	}

}

简单工厂方法:

package factory.simple;

//静态工厂模式,即简单工厂模式
//增加一个新的产品,不修改代码就有点做不到。
//有点违反开闭原则。
public class CarFactory {

	//方法一
	//假如我们需要增加一个实现Car接口的类,大众,这里需要修改代码,所以可以进行一个优化。
	public static Car getCar(String car) {
		
		if(car.equals("WuLing")) {
			return new WuLing();
		}
		else if(car.equals("BMW")){
			return new BMW();
		}
		else 
		{
			return null;
		}	
		
		//假如我们需要增加一个实现Car接口的类,大众,这里需要修改代码,所以可以进行一个优化。
	}
}

静态工厂的测试

package factory.simple;

public class Consumer {

	public static void main(String args[]) {
		
		//这是用普通的方式实现的,首先你需要了解接口,然后了解实现类。
		//这里我们相当于自己造的new。
		Car car = new WuLing();	
		Car car2 = new BMW();			
		car.name();
		car2.name();
		
		//这里使用工厂来创建
		//我无需关心细节,只需要传入一个参数。就能拿到我们想要的对象
		Car car3  = CarFactory.getCar("WuLing");
		car3.name();
		
	}
}

工厂方法需要增加每个接口实现类的工厂类,该类实现一个工厂接口

工厂接口:

package factory.method;

//工厂方法模式,即解决接口实现类增加的方法。
//需要给每一个实现类增加一个工厂类,实现这个工厂接口
public interface CarFactory {

	Car getCar();
}

对应实现类的工厂类

package factory.method;

public class WuLingFactory implements CarFactory {

	@Override
	public Car getCar() {
		// TODO Auto-generated method stub
		return new WuLing();
	}

}
package factory.method;

public class BWMFactory implements CarFactory {

	@Override
	public Car getCar() {
		// TODO Auto-generated method stub
		return new BMW();
	}

}

工厂方法的测试

package factory.method;

public class Consumer {

	public static void main(String args[]) {
		
		//这是用普通的方式实现的,首先你需要了解接口,然后了解实现类。
		//这里我们相当于自己造的new。
		Car car = new WuLing();	
		Car car2 = new BMW();			
		car.name();
		car2.name();
		
		//这里使用工厂来创建
		//我无需关心细节,只需要传入一个参数。就能拿到我们想要的对象
		//Car car3  = CarFactory.getCar("WuLing");
		//car3.name();
		
		//工厂方法模式
		Car car3 = new WuLingFactory().getCar();
		Car car4 = new BWMFactory().getCar();
		car3.name();
		car4.name();
	}
	
	//结构复杂度:简单工厂
	//代码复杂度:简单工厂
	//编程复杂度:简单工厂
	//管理上的复杂度:简单工厂
	
	//根据设计原则:工厂方法,
	//根据实际业务:简单工厂。
}

 

你可能感兴趣的:(设计模式,java,java,设计模式)