简单工厂的构成包括三个角色:
1)抽象产品类
2)具体产品类(继承抽闲产品类)
3)工厂类(生产具体产品)
具体代码实现
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();
}
});
}
}
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/id_bmw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="制造一个BWM汽车"
android:layout_marginBottom="15dp"/>
android:id="@+id/id_benz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="制造一个Benz汽车"
android:layout_marginBottom="15dp"/>
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、缺点
具体的产品类型在编译期间已经确定,不能更改,如果需要新增具体产品就需要修改工厂类,添加新具体产品类,违背了封闭开放原则;
简单工厂必须知道所有需要生产具体产品类,不适用子类过多,子类层级过深的场景