简单工厂,把外面满天飞的new搞进来了。不局限于内部生成对象一定要new。经典的Class.forname("").newInstance();由类名生成类对象,再实例化实例对象。
抽象工厂,讲究的是类型的产品对象,不是杂乱无章的产品对象。产品有类,接口。工厂有类,接口。工厂一对多的产品组合。
如果新来一个产品类别。那得搞多一个产品接口,类。原有工厂如果也跟他拉上关系,也得改,赋予原有工厂修改。
如果新来一个工厂,那就比较简单,实现工厂接口的类建一个。供外部调用。
抽象工厂,jdk经典案例
jdbc
try {
加载第三方包,阔以是mysql、oracle、sqlserver,生成类对象,意图加载关联类文件
java.lang.Class.forName("mysql.driver.XXX");
建立连接,连接connection就一接口,连接也是各个第三方包实现
java.sql.Connection conn = java.sql.DriverManager.getConnection("url address");
声明,就一接口,mysql自己包定义实现。类似工厂,为下方生成各类产品。mysql就一个类型的工厂。
java.sql.Statement s = conn.createStatement();
resultset结果集,就一接口,这个可以比对产品,至于产品模型就这玩意,里面产品是个啥,mysql包里面定义
java.sql.ResultSet resultSet = s.executeQuery("");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
抽象工厂demo:
interface Mouse{
public void doMouse();
}
interface Keybord{
public void doKeybord();
}
class MakeMouse1 implements Mouse{
public void doMouse(){
System.out.println("MakeMouse1");
}
}
class MakeMouse2 implements Mouse{
public void doMouse(){
System.out.println("MakeMouse2");
}
}
class MakeKeybord1 implements Keybord{
public void doKeybord(){
System.out.println("MakeKeybord1");
}
}
class MakeKeybord2 implements Keybord{
public void doKeybord(){
System.out.println("MakeKeybord2");
}
}
interface ProduceFactory{
public void doMouse();
public void doKeybord();
}
class DaierFactory implements ProduceFactory{
public void doMouse(){
MakeMouse1 mouse1 = new MakeMouse1();
mouse1.doMouse();
}
public void doKeybord(){
MakeKeybord1 keybord1 = new MakeKeybord1();
keybord1.doKeybord();
}
}
class SonyFactory implements ProduceFactory{
public void doMouse(){
MakeMouse1 mouse2 = new MakeMouse1();
mouse2.doMouse();
}
public void doKeybord(){
MakeKeybord2 keybord2 = new MakeKeybord2();
keybord2.doKeybord();
}
}
public static void main(String[] args) {
ProduceFactory sonyFactory = new test().new SonyFactory();
sonyFactory.doKeybord();
sonyFactory.doMouse();
DaierFactory daierFactory = new test().new DaierFactory();
daierFactory.doKeybord();
daierFactory.doMouse();