1 工厂模式
工厂模式是当需要new一个对象时通过工厂去创建一个对象。需要和创建的对象解耦时可以用工厂模式。
1.1 工厂模式的实现方式
1.工厂模式分为:简单工厂,工厂方法,抽象工厂
2.1 简单工厂
简单工厂的特点:工厂类是一个具体的类,通过工厂类的主要方法,如getInstance(),你用switch 或者if..else来创建所需要的对象。该实现方法不利于维护和扩展。比如需要怎么加一个DB2数据源,则需要添加具体产品子类并且需要修改工厂类,不好扩展。
//定义数据源接口
interface DataSource{
public void getDataSource();
}
//定义mysql数据源实现类
class MysqlDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是mysql数据源");
}
}
//定义sqlserver数据源实现类
class SqlServerDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是sqlServer数据源");
}
}
//定义oracle数据源实现类
class OracleDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是oracle数据源");
}
}
//定义获取数据源的工厂
class DataSourceFactory{
public static final String TYPE_MYSQL="mysql";
public static final String TYPE_SQLSERVER="sqlserver";
public static final String TYPE_ORACLE="oracle";
public static DataSource getInstance(String type){
switch (type) {
case TYPE_MYSQL:
return new MysqlDataSource();
case TYPE_SQLSERVER:
return new SqlServerDataSource();
default:
return new OracleDataSource();
}
}
}
//测试
public class DataSourceTest {
public static void main(String[] args) {
DataSource instance = DataSourceFactory.getInstance(DataSourceFactory.TYPE_MYSQL);
instance.getDataSource();//输出 “我是mysql数据源”
}
}
(1)简单工厂模式的编写步骤
- 创建产品接口,如 DataSource
- 创建具体的产品子类,如MysqlDataSource,SqlServerDataSource,OracleDataSource
- 创建工厂类,如 DataSourceFactory
2.2 工厂方法
工厂方法是把简单工厂拆分为两层,一层是抽象工厂,一层是抽象工厂的子类。工厂方法利于软件的维护和二次开发。如果有新需求只需要添加对应的子类,而不是修改已有的类,比如增加一个DB2数据源,只需要添加一个DB2产品子类,和DB2的工厂子类就可以了。
//定义数据源接口
interface DataSource{
public void getDataSource();
}
//定义mysql数据源实现类
class MysqlDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是mysql数据源");
}
}
//定义sqlserver数据源实现类
class SqlServerDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是sqlServer数据源");
}
}
//定义oracle数据源实现类
class OracleDataSource implements DataSource{
@Override
public void getDataSource() {
System.out.println("我是oracle数据源");
}
}
//定义工厂抽象类
abstract class DataSourceFactory{
public abstract DataSource create();
}
//定义mysql数据源工厂类
class MysqlDataSourceFactory extends DataSourceFactory{
@Override
public DataSource create() {
return new MysqlDataSource();
}
}
//定义sqlserver数据源工厂类
class SqlServerDataSourceFactory extends DataSourceFactory{
@Override
public DataSource create() {
return new SqlServerDataSource();
}
}
//定义oracle数据源工厂类
class OracleDataSourceFactory extends DataSourceFactory{
@Override
public DataSource create() {
return new OracleDataSource();
}
}
//测试
public class DataSourceTest {
public static void main(String[] args) {
OracleDataSourceFactory dataSourceFactory=new OracleDataSourceFactory();
DataSource create = dataSourceFactory.create();
create.getDataSource();//输出 “我是oracle数据源”
}
}
(1)工厂方法的创建步骤
- 创建产品接口,如 DataSource
- 创建具体的产品子类,如MysqlDataSource,SqlServerDataSource,OracleDataSource
- 创建抽象工厂类,如DataSourceFactory,其中create() 为获取对象实例
- 创建具体的工厂子类,如MysqlDataSourceFactory,SqlServerDataSourceFactory,OracleDataSourceFactory
2.3 抽象工厂
抽象工厂针对的是多产品,每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
public class Test {
public static void main(String[] args) {
DnFactory dnFactory=new DnFactory();
IPen createPen = dnFactory.createPen();
createPen.desc(); //输出 “我是低档钢笔”
}
}
//定义一个钢笔接口
interface IPen{
public void desc();
}
//定义一个高档钢笔
class UpPen implements IPen{
@Override
public void desc() {
System.out.println("我是高档钢笔");
}
}
//定义一个低档钢笔
class DnPen implements IPen{
@Override
public void desc() {
System.out.println("我是低档钢笔");
}
}
//定义一个铅笔接口
interface IPencil{
public void desc();
}
//定义一个高档铅笔
class UpPencil implements IPencil{
@Override
public void desc() {
System.out.println("我是高档铅笔");
}
}
//定义一个低档铅笔
class DnPencil implements IPencil{
@Override
public void desc() {
System.out.println("我是低档铅笔");
}
}
//定义抽象工厂
abstract class IFactory{
abstract IPen createPen();
abstract IPencil createPencil();
}
//定义高档工厂实现
class Upfactory extends IFactory{
@Override
IPen createPen() {
return new UpPen();
}
@Override
IPencil createPencil() {
return new UpPencil();
}
}
//定义低档工厂实现
class DnFactory extends IFactory{
@Override
IPen createPen() {
return new DnPen();
}
@Override
IPencil createPencil() {
return new DnPencil();
}
}
(1)抽象工厂的创建步骤
- 创建产品接口,如 IPen,IPencil
- 创建具体的产品子类,如UpPen,DnPen,UpPencil,DnPencil
- 创建抽象工厂,如IFactory,用于穿件产品对象
- 创建具体的工厂实现类,如Upfactory,DnFactory