一、简单工厂
/*
* 简单工厂(静态工厂)
* */
/*
* 抽象产品类
* */
interface CarProduct{
/*
* 抽象产品类的抽象方法show()。
* */
public void show();
}
/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
public void show(){
System.out.println("It is a BigCar");
}
}
/*
* 具体工厂类
* */
class CarFacory{
/*
* 静态工厂方法。
* 实例化一个BigCarProduct对象。
* */
public static BigCarProduct createBigCar(){
return new BigCarProduct();
}
}
public class FactoryDP {
public static void main(String[] args) {
BigCarProduct bigcar = CarFacory.createBigCar();
bigcar.show();
}
}
/*
* output:
* It is a BigCar
* */
二、工厂方法
/*
* 工厂方法模式
* */
/*
* 抽象产品类
* */
interface CarProduct{
public void show();
}
/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
@Override
public void show() {
System.out.println("It is a BigCar");
}
}
/*
* 抽象工厂类
* */
interface CarFactory{
public CarProduct createCar();
}
/*
* 具体工厂类
* */
class BigCarFactory implements CarFactory{
@Override
/*
* 创建产品类方法
* */
public BigCarProduct createCar() {
return new BigCarProduct();
}
}
public class FactoryDP {
public static void main(String[] args) {
BigCarFactory bigCarFactory = new BigCarFactory();
BigCarProduct bigCarProduct = bigCarFactory.createCar();
bigCarProduct.show();
}
}
/*
*output:
*It is a BigCar
*/
三、抽象工厂
/*
* 抽象工厂模式
* */
/*
* 抽象产品类
* */
interface CarProduct{
public void show();
}
/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
@Override
public void show() {
System.out.println("It is a BigCar");
}
}
class SmartCarProduct implements CarProduct{
@Override
public void show() {
System.out.println("It is a SmartCar");
}
}
/*
* 抽象工厂类
* */
interface CarFactory{
public CarProduct createBigCar();
public CarProduct createSmartCar();
}
/*
* 具体工厂类
* */
class CarBothFactory implements CarFactory{
/*
* 创建产品类方法
* */
@Override
public BigCarProduct createBigCar() {
return new BigCarProduct();
}
@Override
public SmartCarProduct createSmartCar() {
return new SmartCarProduct();
}
}
public class FactoryDP {
public static void main(String[] args) {
CarBothFactory carbothFactory = new CarBothFactory();
carbothFactory.createBigCar().show();
carbothFactory.createSmartCar().show();
}
}
/*
* output:
* It is a BigCar
*It is a SmartCar
* */
四、总结
上面介绍了三种工厂设计模式,其实当你仔细思考他们的原理时其实都是同一个思想,即将产品的生产和产品的获取解耦。
在上面的三种工厂模式中,对于用户来说,不需要知道BigCar与SmartCar是如何进行创建并进行相应配置的,他们只需要获取一个这种Car的工厂,然后调用工厂里的生产方法,即可得到相应的产品。这就是将两者解耦了,也消除了显式的实例化操作。
而这三者又有何区别呢?
1.简单工厂是静态工厂,所以他的生产产品的方法是静态的,在Java面向对象的语法中他自然的丧失了一部分特性,即动态绑定等,因为它属于类而不是对象。
2.工厂方法和抽象工厂其实没什么区别,你从代码中就可以看到,不同之处就在于它将一个产品再度的进行了分类,而那个用来分类的标准的术语叫做产品族,这里的产品族就是Big和Smart,当一个产品需要以一个或多个产品族进行分类时,你写的工厂方法自然就变成了抽象工厂。