简单工厂方法与工厂方法

简单工厂

简单工厂模式的工厂类一般是使用静态方法,通过接受的参数的不同来返回不同的实例(一般情况下不修改代码的话,是无法扩展的)

图不是我画的,简单工厂

Java实现代码

//IDataSource.java
public interface IDataSource {
	void LinkDataBase();
}

//MicroftSQL.java
public class MicrofSQL implements IDataSource {
	
	
	public MicrofSQL() {
		System.out.println("mssql Constructor");
	}

	@Override
	public void LinkDataBase() {
		System.out.println("lingking ms sql");
	}

}

//MysqlDB.java
public class MysqlDB implements IDataSource {

	
	
	public MysqlDB() {
		System.out.println("mysql Constructor");
	}

	@Override
	public void LinkDataBase() {
		System.out.println("linking mysql database!");
	}

}

//SqlFactory.java
public class SqlFactory {
	public static IDataSource LinkDB(String sqlname){//普通方法
		if ("MySQL".equalsIgnoreCase(sqlname))
			return new MysqlDB();
		if ("SQLSERVER".equalsIgnoreCase(sqlname))
			return new MicrofSQL();
		return null;
	}
	/**
	 * 
	 * @param 类名没有定义路径
	 * @return 实例对象
	 * @throws Exception
	 */
	public static IDataSource LinkDBByRefect(String classname) throws Exception{
		
//		return (IDataSource) Class.forName("org.test.simpleFactory."+classname).getConstructors().newInstance();
		return (IDataSource) Class.forName("org.test.simpleFactory."+classname).newInstance();
	}
}


//Test.java
public class Test {
	public static void main(String[] args) throws Exception {
		//普通方式
		IDataSource data = SqlFactory.LinkDB("MySQL");
		IDataSource data2 = SqlFactory.LinkDB("SQLServer");
		data.LinkDataBase();
		data2.LinkDataBase();
                //使用反射方法后,马上和工厂方法一个意思,从代码数量上,比工厂方法更加简便
		IDataSource data3 = SqlFactory.LinkDBByRefect("MicrofSQL");
		IDataSource data4 = SqlFactory.LinkDBByRefect("MysqlDB");
		data3.LinkDataBase();
		data4.LinkDataBase();
		
	}
}

工厂方法

    针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例工厂方法类图不是我画的

以下代码参照Head First的类图

//ILight.java
public interface ILight {//Product
	void TurnOn();
	void TurnOff();
}

//RegLight.java
public class RedLight implements ILight {//ProductA

	@Override
	public void TurnOn() {
		System.out.println("red light on");
	}

	@Override
	public void TurnOff() {
		System.out.println("red light off");
	}

}

//GreanLight.java
public class GreanLight implements ILight {//ProductB

	@Override
	public void TurnOn() {
		System.out.println("grean light on");
	}

	@Override
	public void TurnOff() {
		System.out.println("grean light off");
	}

}

//ICreator.java
public interface ICreator {//IFactory
	ILight factory();
}

//RedCreator.java
public class RedCreator implements ICreator {//FactoryA

	@Override
	public ILight factory() {
		return new RedLight();
	}

}

//GreanCreator.java
public class GreanCreator implements ICreator {//FactoryB

	@Override
	public ILight factory() {
		
		return new GreanLight();
	}

}
//Demo.java
public class Demo {
	public static void main(String[] args) {
		ICreator redc = new RedCreator();
		ICreator greanc = new GreanCreator();
		ILight redl = redc.factory();
		ILight greanl = greanc.factory();
		redl.TurnOn();
		redl.TurnOff();
		greanl.TurnOff();
		greanl.TurnOn();
	}
}



简单工厂在增加产品的时候需要改下simpleFactory和实现product

工厂方法再增加产品的时候需要实现FactoryMethod和Product(ICreator,ILight)

而在简单工厂加入了反射机制,在增加产品的时候只需要实现product就好,但是,Class.forName本身就是工厂方法..

简单工厂只有一个抽象类,IDataSource(IProduct)

工厂方法有两个抽象类,ICreator,ILight(FactoryMethod,Product)



/**引入别人的总结*/

工厂模式中重要的是工厂类,一般来说工厂制造方法只会返回一个类型,这个就是产品的抽象类,

简单工厂-生产同一等级结构中的任意产品(对增加新产品无能为力,反射机制除外)

工厂方法-生产同一等级结构中的固定产品(支持增加任意产品)

抽象工厂:用来生产不同产品蔟的全部产品(对增加新产品无能为力,支持产品簇



抽象工厂

应对产品簇的概念,如每个汽车公司可能要同时生产轿车火车水车客车,

抽象工厂不是我画的

代码不贴出来了,直接点击下载


工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。


抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
    
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值