刚看了一个不错的关于工厂模式的讲解视频,就想着写下来加深一下理解,也方便以后自己复习用。工厂模式主要有三种类型:简单工厂模式、工厂模式和抽象工厂模式,他们之间的关系是层层递进的,依次变得更加抽象。接下来就进入正题。
工厂模式其实就是为了创建某一类的对象,一般我们可以通过new来创建某一类的实例,这种方法需要客户端用到构造模式,也就是知道类内部的具体实现。工厂模式就提供了一种方式:客户端只需要传入想要的对象名就可以获得实例。
简单工厂模式
工厂模式又称为静态工厂方法,属于类创建形模式。可以根据不参数的不同返回不同的实例。专门创建一个类来创建其他类的实例,被创建的实例通常拥有共同的父类,具体的例子如下:
下面展示一些 内联代码片
。
abstract class Product{
public void use() {
}
}
class ProductA extends Product {
public void use(){
System.out.println(使用了产品A);
}
}
class ProductB extends Product {
public void use(){
System.out.println(使用了产品B);
}
}
/*
定义工厂类
*/
class Factory{
public static Product createProduct(String type){
if (type.equals(A)){
return new ProductA();
}else if (type.equals(B)) {
return new ProductB();
}
return new ProductA();
}
public static void main(String[] args){
Product product = Factory.createProduct("A");
product.use();
}
}
工厂模式
工厂模式就是对简单工厂模式的升级。在简单工厂模式种,如果我们想要实现另外的类,也就是工厂类中没有定义的类,我们需要修改工厂类逻辑来满足要求,这不符合开闭原则:对扩展开放,对修改关闭。为了使工厂模式更加灵活,工厂模式采用了延迟创建对象的方式,也就使定义了一个工厂接口,把一大类实例需要满足的方法放在接口里,当具体想申请一个实例的时候先实现这个实例的工厂。范例代码如下:
下面展示一些 内联代码片
。
import java.util.collection;
public class FactoryPattern {
public static void main(string[]args){
Factory factory = new HuaWeiFactory ();
Phone phone = factory.createPhone();
phone.printf();
}
}
interface Phone{
void printf();
}
class iPhone implements Phone{
@Override
public void printf(){
system.out.println("iphone");
}
}
class HuaWeiPhone implements Phone{
@Override
public void printf(){
system.out.println("HuaWeiPhone ");
}
}
/*
工厂接口
*/
interface Factory{
Phone createPhone{};
}
/*
具体工厂类的实现
*/
class IPhoneFactory implements Factory{
@Override
public Phone createPhone() {
return new iPhone{};
}
}
class HuaWeiFactory implements Factory{
@Override
public Phone createPhone() {
return new HuaWeiFactory {};
}
}
抽象工厂模式
抽象工厂模式相比工厂模式只是增加了要实现的产品种类,比如上面的工厂实现了手机类的创建,假如我们现在需要一个口罩的生产类,我们只需要在工厂接口中加入生产口罩所需的方法,然后在具体的工厂类中实现这一方法即可。因此抽象工厂和工厂的区别就是N和1的区别。
总结
工厂设计模式一般包含四个元素:抽象工厂,具体工厂,产品大类,具体产品。抽象工厂就是工厂的接口,具体工厂就是接口的实现,产品大类对应产品的接口,具体产品就是产品的实例化。