怎么做一个设计师网站,商务网站安全方案设计,苏州知名网站建设定制,网站安全建设的重要性概念#xff1a;
工厂模式#xff08;Factory Pattern#xff09;是一种创建型设计模式#xff0c;它提供了一种封装对象实例化过程的方式#xff0c;客户端只需要关注接口或抽象类#xff0c;并由工厂类根据具体需求返回相应的实例。工厂模式将对象的创建与使用分离
工厂模式Factory Pattern是一种创建型设计模式它提供了一种封装对象实例化过程的方式客户端只需要关注接口或抽象类并由工厂类根据具体需求返回相应的实例。工厂模式将对象的创建与使用分离客户端无需直接调用构造函数来创建对象。工厂模式定义了一个抽象工厂和多个具体工厂每个具体工厂负责创建特定类型的产品。
特点
封装性隐藏了对象实例化细节客户端只需要与抽象接口交互。扩展性易于添加新产品或变更现有产品的实现。解耦性将客户端与具体产品之间解耦降低了代码依赖关系。
优点
符合开闭原则新增产品时无需修改已有代码在扩展上更加灵活。降低耦合度客户端仅依赖于抽象接口而非具体实现类。高内聚、低耦合相关逻辑被封装在各自的具体工厂中。
缺点
增加系统复杂度引入额外的类和层级增加了代码量。需要额外的工厂类每个具体产品都需要对应一个具体工厂类。
适用场景
需要创建多个相似对象的场景。客户端不关心实例化过程和细节只需获取抽象接口即可的场景。
实现方式
简单工厂模式
实现原理
定义一个接口或父类来表示产品。创建具体产品类它们继承自父类或实现接口。创建一个简单工厂类该类包含一个静态方法用于根据客户端传入的参数来创建相应的具体产品对象。
实现代码
// 接口或父类
interface Product {void doSomething();
}// 具体产品A
class ConcreteProductA implements Product {Overridepublic void doSomething() {System.out.println(ConcreteProductA do something);}
}// 具体产品B
class ConcreteProductB implements Product {Overridepublic void doSomething() {System.out.println(ConcreteProductB do something);}
}// 简单工厂类
public class SimpleFactory {// 静态方法根据参数创建对应的具体产品对象public static Product createProduct(String type) {if (type.equals(A)) { return new ConcreteProductA();} else if (type.equals(B)) { return new ConcreteProductB();} else { throw new IllegalArgumentException(Invalid product type.);}}public static void main(String[] args){Product a SimpleFactory.createProduct(A);a.doSomething();}
}上述代码中我们定义了一个 Product 接口作为抽象基类然后创建了两个具体产品类 ConcreteProductA 和 ConcreteProductB它们都实现了 Product 接口。最后我们创建了一个简单工厂类 SimpleFactory其中的静态方法根据客户端传入的参数来创建相应的具体产品对象。使用简单工厂模式时存在以下问题
违反开闭原则每次添加新产品都需要修改工厂类中的代码。工厂职责过重所有产品的创建逻辑集中在一个工厂类中导致该类变得庞大而复杂。
尽管简单工厂模式存在以上问题但它仍然是一种常用且易于理解和实现的工厂模式。
工厂方法模式
实现原理
定义一个接口或父类来表示产品。创建具体产品类它们继承自父类或实现接口。创建一个抽象工厂接口该接口声明了创建产品的方法。创建多个具体工厂类每个具体工厂类负责创建特定类型的产品。
实现代码
// 接口或父类
interface Product {void doSomething();
}// 具体产品A
class ConcreteProductA implements Product {Overridepublic void doSomething() {System.out.println(ConcreteProductA do something);}
}// 具体产品B
class ConcreteProductB implements Product {Overridepublic void doSomething() {System.out.println(ConcreteProductB do something);}
}// 抽象工厂接口
interface Factory {Product createProduct();
}// 具体工厂A用于创建具体产品A
class ConcreteFactoryA implements Factory {Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B用于创建具体产品B
class ConcreteFactoryB implements Factory {Override public Product createProduct() { return new ConcreteProductB();}
}上述代码中我们定义了一个 Product 接口作为抽象基类然后创建了两个具体产品类 ConcreteProductA 和 ConcreteProductB它们都实现了 Product 接口。接着我们定义了一个抽象工厂接口 Factory其中声明了一个用于创建产品的方法。最后我们创建了两个具体工厂类 ConcreteFactoryA 和 ConcreteFactoryB分别用于创建具体产品 A 和 B。
使用工厂方法模式时存在以下问题
每次添加新产品需要同时增加对应的具体工厂类。客户端需要知道不同的具体工厂类来获取不同类型的产品。
尽管存在以上问题但工厂方法模式能够提供更好的扩展性和灵活性并且符合开闭原则。客户端只需关注与特定的抽象工厂和产品进行交互即可。
抽象工厂模式
实现原理:
定义产品族接口该接口声明了一组相关的产品。创建多个具体产品族类每个具体产品族类负责实现对应的抽象产品族接口。定义抽象工厂接口该接口声明了用于创建不同产品族对象的方法。创建多个具体工厂类每个具体工厂类负责创建特定类型的产品族对象。
实现代码
//产品A
interface ProductA {void doSomething();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {Overridepublic void doSomething() {System.out.println(ConcreteProductA1 do something);}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {Overridepublic void doSomething() {System.out.println(ConcreteProductA2 do something);}
}// 抽象产品B
interface ProductB { void doSomething();
} // 具体产品B1
class ConcreateProductB1 implements ProductB { Override public void doSomething() { System.out.println(ConcreteProductB1 do something); }
} // 具体产品B2
class ConcreateProductB2 implements ProductB { Override public void doSomething() { System.out.println(ConcreteProductB2 do something); }
}// 抽象工厂接口
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1用于创建具体产品族1
class ConcreteFactory1 implements AbstractFactory {Overridepublic ProductA createProductA() {return new ConcreteProductA1();}Overridepublic ProductB createProductB() {return new ConcreateProductB1();}
}// 具体工厂2用于创建具体产品族2
class ConcreteFactory2 implements AbstractFactory {Override public ProductA createProductA() { return new ConcreteProductA2(); } Override public ProductB createProductB() { return new ConcreateProductB2(); }
}上述代码中我们定义了两个产品接口 ProductA 和 Prodcut B并分别实现了它们的具体产品类。然后我们定义了一个抽象工厂接口 AbstractFactory其中声明了两个方法用于创建不同类型的抽象产品对象。最后我们创建了两个具体工厂类 ConcreteFactory1 和 ConcreteFactory2 分别负责创建特定的抽象产品族对象。
使用抽象工厂模式时存在以下问题
每次添加新产品族需要同时增加对应的产品接口和具体产品类。客户端需要知道不同的具体工厂类来获取不同类型的抽象产品。
尽管存在以上问题但抽象工厂模式能够提供更好的扩展性和灵活性并且符合开闭原则。客户端只需关注与特定的抽象工厂和产品进行交互即可。