工厂方法模式(通过继承)
在变化里面找出稳定的部分,才有引入设计模式的价值
本质
把产品具体的实例化过程给推迟到子类
即根据不同的参数 构建不同的实例化对象
开闭原则
只加入新的逻辑 没有修改旧的原则
单一职责原则
一个产品负责专门做这个产品做的事
应用场景
- 当你不知道该使用对象的确切类型的时候
- 当你希望为库或者框架提供扩展其内部组件的方法时
主要优点
- 将具体产品和创建者解耦
- 符合单一职责原则
- 符合开闭原则
实例
public class FactoryMethod {
public static void main(String[] args) {
ConcreateProductA a = new ConcreateProductA();
Product product = a.createProduct();
product.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product {
@Override
public void method1() {
System.out.println("ProductA Method");
}
}
class ProductA1 implements Product {
@Override
public void method1() {
System.out.println("ProductA1 Method");
}
}
abstract class Application{
abstract Product createProduct();
Product getObject(){
Product product = createProduct();
//存在初始化的过程
return product;
}
}
class ConcreateProductA extends Application {
@Override
Product createProduct() {
//存在实例化的过程
return new ProductA();
}
}
class ConcreateProductA1 extends Application {
@Override
Product createProduct() {
//存在实例化的过程
return new ProductA1();
}
}
抽象工厂模式(通过接口)
提供一个创建一系列或互相依赖对象的接口,而无需指定他们具体的类
通过一系列定义的规范去实现一个产品
public class AbstractFactoryTest {
public static void main(String[] args) {
IDatabaseUtils data = new mysqlDatabaseUtils();
data.getIcommand().command();
data.getIconnection().connection();
IDatabaseUtils data1 = new oracleDatabaseutils();//当我们需要新的产品时 就去实现相应的接口
data1.getIcommand().command();
data1.getIconnection().connection();
}
}
// 变化的是 使用的数据库mysql oracle
// connection sql语句的执行
interface Iconnection{
void connection();
}
interface Icommand{
void command();
}
interface IDatabaseUtils {
Iconnection getIconnection();
Icommand getIcommand();
}
class MysqlConnect implements Iconnection{
@Override
public void connection() {
System.out.println("mysql connection");
}
}
class MysqlCommand implements Icommand{
@Override
public void command() {
System.out.println("mysql command.");
}
}
class mysqlDatabaseUtils implements IDatabaseUtils{
@Override
public Iconnection getIconnection() {
return new MysqlConnect();
}
@Override
public Icommand getIcommand() {
return new MysqlCommand();
}
}
class oracleconnect implements Iconnection{
@Override
public void connection() {
System.out.println("orcle connection");
}
}
class oraclecommand implements Icommand{
@Override
public void command() {
System.out.println("orcle command");
}
}
class oracleDatabaseutils implements IDatabaseUtils{
@Override
public Iconnection getIconnection() {
return new oracleconnect();
}
@Override
public Icommand getIcommand() {
return new oraclecommand();
}
}