设计模式:简单工厂/静态工厂方法模式

简单工厂的构成包括三个角色:

1)抽象产品类

2)具体产品类(继承抽闲产品类)

3)工厂类(生产具体产品)

具体代码实现

c81c9e01da60eb3253fa39a8c7cbf54555a.jpg

1、抽象产品类


/**
 * 抽象类
 */
public abstract class Car {
    /**
     * 产品抽象方法,将会由具体产品类实现
     */
    public abstract void driving();
}

2、具体产品类


/**
 * 具体产品类BenZCar
 */
public class BenZCar extends Car {
    @Override
    public void driving() {
        System.out.println("BenZCar is Driving!!!");
    }
}




/**
 * 具体产品类BMWCar
 */
public class BMWCar extends Car {
    @Override
    public void driving() {
        System.out.println("BMWCar is Driving!!!");
    }
}





3、工厂类


/**
 * 简单工厂类
 */

public class CarFactory {

    public static Car create(String type) {
        Car car = null;
        switch (type) {
            case "bmw":
                car = new BMWCar();
                break;
            case "benz":
                car = new BenZCar();
                break;

        }
        return car;
    }


}

4、调用(这里使用AndroidStudio代码测试,如果是java的可以在main函数中测试)


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.id_bmw).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CarFactory.create("bmw").driving();
            }
        });

        findViewById(R.id.id_benz).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CarFactory.create("benz").driving();
            }
        });
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/id_bmw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="制造一个BWM汽车"
        android:layout_marginBottom="15dp"/>

    <Button
        android:id="@+id/id_benz"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="制造一个Benz汽车"
        android:layout_marginBottom="15dp"/>

</LinearLayout>

5、界面

6、测试结果

08-20 10:59:55.001 3660-3660/com.tech.aile.designpatterns I/System.out: BMWCar is Driving!!!
08-20 10:59:56.573 3660-3660/com.tech.aile.designpatterns I/System.out: BenZCar is Driving!!!
 

7、使用场景

1)工厂类创建的具体对象要较少,不适用子类过多,子类层级过深的场景。

2)看客户只需要传入什么类型的参数,不用关注创建对象的逻辑。

8、优点

根据参数类型获取实例,不用关注具体细节,降低了耦合

9、缺点

具体的产品类型在编译期间已经确定,不能更改,如果需要新增具体产品就需要修改工厂类,添加新具体产品类,违背了封闭开放原则;

简单工厂必须知道所有需要生产具体产品类,不适用子类过多,子类层级过深的场景

猜你喜欢

转载自blog.csdn.net/weixin_36709064/article/details/82190332
今日推荐