1.简单工厂模式
interface Product {public void setName();}class ProductA implements Product {@Overridepublic void setName() {System.out.println("set name ProductA");}}class ProductB implements Product {@Overridepublic void setName() {System.out.println("set name ProductB");}}class ProductFactory{public static Product createProduct(String type){if(type.equals("A")){return new ProductA();}else if(type.equals("B")){return new ProductB();}else{return null;}}}public class FactoryTest {public static void main(String[] args) {Product product = ProductFactory.createProduct("A");product.setName();}}
2.工厂方法模式,让一个类的实例化延迟到子类
abstract class AbsProduct{abstract Product productCreat();}class ConCreateProductA extends AbsProduct{@OverrideProduct productCreat() {return new ProductA();}}class ConCreateProductB extends AbsProduct{@OverrideProduct productCreat() {return new ProductB();}}public class FactoryTest {public static void main(String[] args) {Product product = ProductFactory.createProduct("A");product.setName();AbsProduct absProduct = new ConCreateProductA();Product product1 = absProduct.productCreat();product1.setName();}}
应用场景
1.当你不知道改使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时
主要优点:
1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则
源码中的应用:
1//javaapi
2//静态工厂方法
3Calendar.getInstance()
4java.text.NumberFormat.getInstance()
5java.util.ResourceBundle.getBundle()
6//工厂方法
7java.net.URLStreamHandlerFactory10javax.xml.bind.JAXBContext.createMarshaller
3.抽象工厂模式
抽象工厂模式定义:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类,注意,千万别误以为抽象工厂就必须要和abstract抽象类有关系。
其实就是定义一组接口由不同的产品去实现。如下面定义了三个接口,由mysql和oracle分别去实现。
开发需求:开发一个数据库的连接组件
interface IConnection{void connect();}interface ICommand{void command();}interface IDataBaseUtil{IConnection getConnection();ICommand getCommand();}class MysqlConnection implements IConnection{@Overridepublic void connect() {System.out.println("Mysql connected");}}class MysqlCommand implements ICommand{@Overridepublic void command() {System.out.println("Mysql command");}}class MysqlDataBaseUtil implements IDataBaseUtil{@Overridepublic IConnection getConnection() {return new MysqlConnection();}@Overridepublic ICommand getCommand() {return new MysqlCommand();}}class OracleConnection implements IConnection{@Overridepublic void connect() {System.out.println("Oracle connected");}}class OracleCommand implements ICommand{@Overridepublic void command() {System.out.println("Oracle command");}}class OracleDataBaseUtil implements IDataBaseUtil{@Overridepublic IConnection getConnection() {return new OracleConnection();}@Overridepublic ICommand getCommand() {return new OracleCommand();}}public class AbstractFactoryTest {public static void main(String[] args) {IDataBaseUtil iDataBaseUtil = new OracleDataBaseUtil();IConnection connection = iDataBaseUtil.getConnection();connection.connect();ICommand command = iDataBaseUtil.getCommand();command.command();}}
应用场景:
程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂
优点:
1.可以确信你从工厂得到的产品彼此是兼容的。
2.可以避免具体产品和客户端代码之间的紧密耦合。
3.符合单一职责原则
4.符合开闭原则
JDK源码中的应用:
1java.sql.Connection
2java.sql.Driver
