设计模式——工厂模式

工厂模式实现了创建者和调用者的分离。工厂模式的作用就是在实例化对象的时候代替了以往的new操作,将实现类、创建对象进行统一管理。详细分为:简单工厂模式、工厂方法模式、抽象工厂模式。使用工厂模式时最好要遵循面向对象设计的基本原则,即开闭原则、依赖倒转原则和迪米特法则。开闭原则:作为一个软件的应用程序的可扩展性,应当对扩展开放,对修改关闭。依赖倒转原则:要求要针对接口编程不要针对实现编程。迪米特法则:只与你有直接关系的进行沟通交流,而躲避那些陌生的和你不相干的,不与他们进行沟通交流。

简单工厂模式

下面我们先来说一下简单工厂模式,简单工厂模式当然实现起来是最简单的,下面我们以生产不同颜色的衣服为例:
工厂刚生产的布料还没有染色的时候

public interface Clothes {
    String color(String color);
}

准备将生产的一部分布料染成蓝色的

public class BlueClothes implements Clothes {
    @Override
    public String color(String color) {
        return color;
    }
}

准备将生产的一部分布料染成红色的

public class RedClothes implements Clothes {
    @Override
    public String color(String color) {
        return color;
    }
}

染色工厂进行分区

public class SimpleFactory {
    public static Clothes dyeingBlue(String product){
        return new BlueClothes();
    }
    public static Clothes dyeingRed(String product){
        return new RedClothes();
    }
}

最后工人开始对布料进行染色处理

 Clothes blueClothes = SimpleFactory.dyeingBlue("blue");
 Clothes redClothes = SimpleFactory.dyeingRed("red");
 blueClothes.color("蓝色");
 redClothes.color("红色");

以上是简单工厂的实现,但是此模式不遵循开闭原则,如果我们向生产黑色的衣服还需要在SimpleFactory 里面添加一个生产黑色衣服的方法,这样就违背了开闭原则的只扩展不修改。

工厂方法模式

它弥补了简单工厂模式的不满足开闭原则,工厂方法模式和简单工厂模式的不同之处在于,简单工厂模式只有一个工厂类也就是上面的SimpleFactory 这个类,而工厂方法模式是有一些实现了相同接口的工厂类。工厂方法模式的适用性:1.当一个类不知道它所必须创建的对象的类的时候。2.当一个类希望由它的子类来指定它所创建的对象的时候。3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
还以上面的例子为准,如果我们想增加一个黑色服装的加工怎么办?另开一个工厂加工黑色服装的,这样的话也方便各做各的事情

工厂刚生产的布料还没有染色的时候

public interface Clothes {
    String color(String color);
}

准备将生产的一部分布料染成蓝色的染料机器

public class BlueClothes implements Clothes {
    @Override
    public String color(String color) {
        return color;
    }
}

这里又专门增加一个工厂,专门生产蓝色服装的工厂

public class BlueClothesFactory implements ClothesFactory {
    @Override
    public Clothes dyeing(String color) {
        return new BlueClothes();
    }
}

准备将生产的一部分布料染成红色的染料机器

public class RedClothes implements Clothes {
    @Override
    public String color(String color) {
        return color;
    }
}

这里又专门增加一个工厂,专门生产红色服装的工厂

public class RedClothesFactory implements ClothesFactory {
    @Override
    public Clothes dyeing(String color) {
        return new RedClothes();
    }
}

如果想生产黑色的服装,很简单在开一个工厂和黑色的染料机器,下面的是黑色服装的染料机器

public class BlueClothes implements Clothes {
    @Override
    public String color(String color) {
        return color;
    }
}

生产黑色服装的加工工厂

public class BlackClothesFactory implements ClothesFactory {
    @Override
    public Clothes dyeing(String color) {
        return new BlackClothes();
    }
}

最后各个工厂开始加工生产服装

Clothes blueClothes = new BlueClothesFactory().dyeing("blue");
Clothes redClothes = new RedClothesFactory().dyeing("red");
Clothes blackClothes = new BlackClothesFactory().dyeing("black");
blueClothes.color("蓝色");
redClothes.color("红色");
blackClothes.color("黑色");

工厂方法模式的弊端结构复杂度比简单工厂模式要复杂一些,编程难度来说简单工厂模式的工厂类是个静态类,无需再编码中进行实例化,而工厂方法模式需要进行实例化,管理上的难度简单工厂模式要比工厂方法模式容易的多,虽然设计的理念是工厂方法模式,但是在实际的开发过程中我们一般还是使用的简单工厂模式。

抽象工厂模式

抽象工厂模式是工厂方法的升级版,它是用来生产不同产品集合的全部产品。在有多个产品的分类时,抽象工厂模式产生需要的对象是一种很好的解决方式。它的操作主要是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用性1.一个系统要独立于它的产品的创建、组合和表示时。2.一个系统要由多个产品系列中的一个来配置时。3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
比如我们使用的手机,手机都是有摄像头,手机屏,内存等等组合而成。那么摄像头,手机屏,cpu就属于不同的种类,那么就要分别进行加工生产,然后再进行拼装。但是不同的手机的质量有好有坏,好的手机当然配置也是很高档的,如果本来是五千的手机,配置跟五百的手机一样谁会去买五千的手机呢?嫌钱多烫手的例外。
生产屏幕

public interface Screen {
    String clarity(String clarity);

    class HighGrade implements Screen {

        @Override
        public String clarity(String clarity) {
            return clarity;
        }
    }
    class Bastard implements Screen {

        @Override
        public String clarity(String clarity) {
            return clarity;
        }
    }
}

生产摄像头

public interface Camera{
    String pixel(String pixel );

    class HighDefinition implements Camera {

        @Override
        public String pixel (String pixel ) {
            return pixel ;
        }
    }
    class General implements Camera {

        @Override
        public String pixel(String pixel ) {
            return pixel ;
        }
    }
}

生产内存

public interface Memory{
String storage(String storage);
class Large implements Memory{

    @Override
    public String storage(String storage) {
        return storage;
    }
}
class Small implements Memory{

    @Override
    public String storage(String storage) {
        return storage;
    }
}
}

手机工厂

public interface PhoneFactory{
    Screen productScreen();
    Camera productCamera();
    Memory productMemory();
}

专门生产高配置的工厂

public class HighWithFactory implements PhoneFactory{

    @Override
    public Screen productScreen() {
        return new Screen.HighGrade();
    }

    @Override
    public Camera productCamera() {
        return new Camera.HighDefinition();
    }

    @Override
    public Memory productMemory() {
        return new Memory.Large();
    }
}

加工产品

PhoneFactory phoneFactory = new HighWithFactory();
Camera camera = phoneFactory.productCamera();
camera.pixel("像素高");
Memory memory = phoneFactory.productMemory();
memory.storage("内存大");
Screen screen = phoneFactory.productScreen();
screen.clarity("高清");

到这里关于工厂的一些模式已经介绍完了,这里再总结一下,简单工厂模式又叫静态工厂模式,虽然不符合开闭原则,但是使用者还是最多。工厂方法模式在不修改已有类的情况下,通过增加新的工厂类来实现扩展。抽象工厂不能增加产品,但是可以增加产品的类型集合。比如我们的手机就是一个产品,而摄像头就是一个产品类型的集合。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值